2011-05-15 67 views
4

我有一個我想要序列化爲XML的類。序列化時類的外部元素的名稱需要由應用程序控制。C#在序列化爲XML時控制元素名稱

在設計時,我知道該元素的名稱可以通過使用XmlTypeAttribute

[XmlElement(Name="MyName")] 

我需要在運行時控制這個所以這不會對我的工作進行控制。

我也查看了IXmlSerializable來創建我自己的序列化代碼,但是這又不起作用,因爲這隻允許控制類的「內部」而不是外部包裝。

還有其他選擇嗎?

+1

您可能可以在您的類上定義靜態變量「ElementName」,然後執行'[XmlElement(MyClass.ElementName)]'。我沒有發佈這個作爲答案,因爲我不知道它會正常工作。 – 2011-05-15 21:34:09

+0

您無法在運行時指定屬性參數。 – SLaks 2011-05-15 21:38:52

+2

您可以在運行時使用XmlAttributeOverrides http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeoverrides.aspx,但前提是您要控制XmlSerializer的使用。如果您使用隱式序列化的自定義類型 - 例如WCF,它將不起作用。如果您發佈更多的場景,我可以提供一些更好的見解,看它是否適合您。 – Cheeso 2011-05-15 21:39:16

回答

2

是的,正如Cheeso在評論中指出的,你可以用做XmlAttributeOverrides

XmlAttributes overrideAttributes = new XmlAttributes(); 
overrideAttributes.XmlRoot = new XmlRootAttribute("Testing"); 

XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
overrides.Add(typeof(string[]), overrideAttributes); 

XmlSerializer serialise = new XmlSerializer(typeof(string[]), overrides); 

using (MemoryStream stream = new MemoryStream()) 
{ 
    serialise.Serialize(stream, new string[] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString() }); 
} 

輸出:

<?xml version="1.0"?> 
<Testing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <string>37d47837-62d0-46dc-9747-709b91bdac6e</string> 
    <string>9cd904a9-f86f-46c1-a2aa-49c44bc3c654</string> 
</Testing> 

Xml序列(大約)工作的基礎上,即:

  • 被序列化的對象決定如何對其內容進行序列化(包括根元素的屬性)
  • 但是,調用者負責創建根元素(並在反序列化中使用它)。

你可以看到這個不同於IXmlSerializable接口的工作方式 - 被序列化對象可以使用XmlRootAttribute屬性作爲建議向根元素應該是什麼樣子的調用者,但最終還是要由調用者創建根元素(通常由XmlSerializer類處理)。

相關問題