2010-05-18 52 views
0

我的類結構如下。C#中的序列化

[Serializable] 
[XmlRootAttribute("person", Namespace = "", IsNullable = false)] 
public class Person : IDisposable 
{ 
     Private int _id; 
     Private string _name; 

     [XmlElement(「id」)] 
     Public int Id 
     { 
      Get{ return _id;} 
      Set{ _id = value;} 
     } 

     [XmlElement(「name」)] 
     Public string Name 
     { 
      Get{return _name;} 
      Set{_name = value;} 
     } 
} 

我正在以下XML時序列化上面的類現在

<person> 
<id>1</id> 
    <name>Test</name> 
</person> 

,我想序列化上面的類,如下所示即我想對於每個公共追加「類型」屬性屬性被序列化爲xml元素。我可以通過用「[XmlAttribute(」type「)]」聲明另一個公共屬性「type」來將「type」屬性附加到「person」節點,但是我想爲每個被序列化爲xml元素的公共屬性實現相同的功能。任何想法,以低於實現:

<person type=」Person」> 
    <id type=」int」>1</id> 
    <name type=」string」>Test</name> 
</person> 

回答

2

第一件事進入我的腦海裏是創建一個通用類,命名爲例如Typed<T>,它看起來像這樣:

然後你Public int Id ,變成Public Typed<int> Id。可能還有另一種涉及xml解析器代理的方法,但現在這是我的頭頂。

+0

+1瘋狂的選擇! ...將類型化的的隱式轉換添加到T中,並且您可以更簡單地使用:) – eglasius 2010-05-18 15:17:06

0

Ivan的答案很好,很有創意,但可能會涉及到重構代碼,你不想觸摸。如果是這樣的話,你可以考慮實施IXmlSerializable。它涉及到直接與XmlWriterXmlReader一起工作,但只要你知道使用這些類(特別是XmlReader)的缺陷,它並沒有那麼糟糕,並且它能夠最大限度地控制XML的格式。

如果你想獲得看上你甚至可以寫一個XmlSerializationWrapper<T>實現IXmlSerializable,並使用反射來獲取的T[Xml...]屬性及其成員,以確定如何格式化/讀取XML,添加/使用類型屬性。但是在那個時候,使用Ivan的解決方案可能不那麼瘋狂。

+0

聲音富有創意;我可以嘗試一下,但是我必須爲所有內置類型進行裝飾。這是要走的路嗎? – 2010-05-18 18:01:50

+0

如果採用通用方式,是否需要爲內置類型進行修飾取決於您如何實現可序列化成員的發現。我傾向於像框架的序列化一樣處理它:如果一個屬性裝飾有XML屬性,則按屬性所指示的序列化;如果用XmlIgnore修飾,請不要序列化它;如果未修飾,則使用該屬性的名稱作爲節點名稱進行序列化。添加type屬性只是寫出typeof(property).Name的問題。 – allonym 2010-05-19 16:48:34