2010-07-14 38 views
21

我有一個類,其中有很多可空屬性,我想將其作爲屬性序列化爲XML。這顯然是一個「不」,因爲它們被認爲是「複雜類型」。所以,相反我實現*指定的模式,我在那裏建立一個除*值和*指定屬性如下:XmlSerializer和可空屬性

 
[XmlIgnore] 
public int? Age 
{ 
    get { return this.age; } 
    set { this.age = value; } 
} 

[XmlAttribute("Age")] 
public int AgeValue 
{ 
    get { return this.age.Value; } 
    set { this.age = value; } 
} 

[XmlIgnore] 
public bool AgeValueSpecified 
{ 
    get { return this.age.HasValue; } 
} 

工作正常 - 如果「年齡」屬性的值,它是序列化爲屬性。如果它沒有值,則不會序列化。

問題是,正如我所提到的,我的課上有很多Nullable-s,這種模式只是讓事情變得凌亂和難以管理。

我希望有一種方法可以讓Nullable更友好XmlSerializer。或者,如果失敗了,則可以創建一個Nullable替代品。

有沒有人有任何想法我可以做到這一點?

謝謝。

回答

8

在你的課堂上實現IXmlSerializable接口。然後您可以處理ReadXMLWriteXML方法中的特殊情況,例如可空。 There's a good example in the MSDN documentation page.


class YourClass : IXmlSerializable 
{ 
    public int? Age 
    { 
     get { return this.age; } 
     set { this.age = value; } 
    } 

    //OTHER CLASS STUFF// 

    #region IXmlSerializable members 
    public void WriteXml (XmlWriter writer) 
    { 
     if(Age != null) 
     { 
      writer.WriteValue(Age) 
     } 
    } 

    public void ReadXml (XmlReader reader) 
    { 
     Age = reader.ReadValue(); 
    } 

    public XmlSchema GetSchema() 
    { 
     return(null); 
    } 
    #endregion 
} 
+0

我想這將不得不做 - 它能很好地告訴一個'複雜'類型作爲一個屬性序列化。 – Barg 2010-07-15 14:03:17

9

我有一些代碼,我正在對類似的問題,我決定只用了我序列化的財產和反序列化的字符串。我結束了這樣的事情:

[XmlAttribute("Age")] 
public string Age 
{ 
    get 
    { 
     if (this.age.HasValue) 
      return this.age.Value.ToString(); 
     else 
      return null; 
    } 
    set 
    { 
     if (value != null) 
      this.age = int.Parse(value); 
     else 
      this.age = null; 
    } 
} 

[XmlIgnore] 
public int? age;