2015-06-10 30 views
2

我使用xsd生成器工具從xml模式生成自動生成的c#類文件。在序列化時重命名xml模式類中的屬性

在這個類中有一個屬性,我需要在xml文件創建時從「Balance」重命名爲「balance」。

由於這是一個生成的類,我需要在seralizing之前動態地更新創建的xml對象,所以不能僅僅使用期望的名稱在類屬性上添加atrribute。

我已經完成忽略使用某些屬性的任務XMLATTRIBUTES類,所以我肯定有東西,我可以沿着相同的路線做

任何人都可以點我在如何實現這一目標的方向是什麼?

感謝

+1

'[XmlElement(「balance」)]'元素上的標籤? – Baldrick

+0

它生成的類,所以我不能添加,需要被操縱就在我序列化對象 – AdrianSean

+0

是,你需要從XML有''向並行化和串行到XML有''的想法? –

回答

1

我已成功使用,以解決我的問題如下:

var overrides = new XmlAttributeOverrides(); 

overrides.Add(typeof(MyGeneratedCustomType), "Balance", new XmlAttributes { XmlAttribute = new XmlAttributeAttribute("balance") }); 

var serializer = new XmlSerializer(xmlFile.GetType(), overrides); 

MyGeneratedCustomType是出現在持有我需要重新命名的屬性生成的XSD類的類型。它是一個優雅的解決方案,因爲所需的代碼非常少。

+0

在這裏學到了新的東西。涼。 –

0

假設你需要序列化從XML這樣的:

<root> 
    <Balance /> 
</root> 

,然後序列化到XML這樣的:

<root> 
    <balance /> 
</root> 

你這裏有兩種選擇:

  1. 您可以創建第二個類,以各種方式鏡像您的自動生成的類,除了在鏡像類中的Balance屬性上有[XmlElement("balance")]。如果生成的類是XsdGenerated,鏡像類是CustomClass,請創建構造函數或覆蓋=的操作符,以便能夠使用XsdGenerated中的所有字段填充CustomClass。當你序列化CustomClass時,你應該得到想要的結果。我認爲這是更好的選擇。

  2. 實施IXmlSerializableXsdGenerated。在ReadXml方法調用base(),只是有WriteXml方法小寫創建balance標籤。注意,此選項可能是更具挑戰性的寫/維持,並會限制你的序列化和反序列化能力 - 這將會是一個單向操作,除非你創建了一個更復雜的機制來設置是否ReadXml()WriteXml()應該把balance與大寫或小寫b。

+0

謝謝丹,我更喜歡選項1作爲決議,最後我設法找到了我剛剛發佈的另一種方式。 – AdrianSean

+1

另外 - 這是我的問題的一個很好的起點。 http://stackoverflow.com/questions/9377414/excluding-some-properties-during-serialization-without-changing-the-original-cla – AdrianSean