2012-11-14 148 views
1

有用於連載Nullable類型的SO,但我需要的是爲deserialising到可空類型的解決方案的各種解決方案。 Specified和ShouldSerailise技術似乎不適用於反序列化。Deserialise缺少XML屬性空類型

所以,如果我的XML文檔中缺少的屬性我想在類中的int爲空不爲0

不幸的是,你不能直接,因爲序列化拋出反射誤差序列化到一個可空int類型。

所以在下面的例子中,我想result2.SomeInt爲空和result1.SomeInt = 12

class TestProgram 
{ 
    public static void Main(string[] args) 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(Result)); 

     Stream xmlStream = new MemoryStream(Encoding.ASCII.GetBytes(docWithVal().InnerXml)); 
     var result1 = (Result)deserializer.Deserialize(xmlStream); 

     Stream xmlStream2 = new MemoryStream(Encoding.ASCII.GetBytes(docWithoutVal().InnerXml)); 
     var result2 = (Result)deserializer.Deserialize(xmlStream2); 
    } 

    public static XmlDocument docWithoutVal() 
    { 
     var doc = new XmlDocument(); 
     doc.LoadXml(@"<Result/>"); 
     return doc; 
    } 

    public static XmlDocument docWithVal() 
    { 
     var doc = new XmlDocument(); 
     doc.LoadXml(@"<Result SomeInt = ""12""/>"); 
     return doc; 
    } 
} 

[Serializable] 
public class Result 
{ 
    [XmlAttribute] 
    public int? SomeInt { get; set; } 
} 
+0

即使您使用int屬性來代替int?第二個序列化將不起作用,因爲XML中缺少SomeInt屬性。 –

+0

如果'SomeInt'的值爲0,你想要的值是否應該爲null? –

+0

除非您使用自定義(de)序列化程序,否則我想您在嘗試將Nullable屬性序列化爲XmlAttribute時會遇到問題。它應該是XmlElement。 – jbl

回答

1

您可以INFACT反序列化後使用指定的技術。修改您的Result類是這樣的:

[Serializable] 
public class Result 
{ 
    [XmlAttribute] 
    public int SomeInt { get; set; } 

    [XmlIgnore] 
    public bool SomeIntSpecified; 
} 

現在使用反序列化後這個邏輯Nullable類型:

var value = SomeIntSpecified ? SomeInt : null; 

,或者您也可以在你的Result類實現IXmlSerializable

[Serializable] 
public class Result : IXmlSerializable 
{ 
    public int? SomeInt { get; set; } 

    #region IXmlSerializable members 

    public void WriteXml(XmlWriter writer) 
    { 
     if (SomeInt != null) { writer.WriteValue(writer); } 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     int result; 
     if (int.TryParse(reader.GetAttribute("SomeInt"), out result)) 
      SomeInt = result; 
    } 

    public XmlSchema GetSchema() 
    { 
     return (null); 
    } 

    #endregion 
} 

參考:Using XmlSerializer to deserialize into a Nullable

+0

有沒有實現IXmlSerializable的方法。 Id不想在readxml中複製我所有的屬性,並且使用反射可能是一個糟糕的主意。 – Jules

+0

看到我編輯的答案與工作指定的技術。 –

+0

我的回答對你有幫助嗎? –