将缺少的XML属性反序列化为Nullable类型

时间:2012-11-14 14:43:27

标签: c# xml-serialization

在SO上有序列化 Nullable类型的各种解决方案,但我需要的是反序列化到可空类型的解决方案。 Specified和ShouldSerailise技术似乎不适用于反序列化。

因此,如果我的XML文档缺少一个属性,我希望类中的int为null而不是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; }
}

1 个答案:

答案 0 :(得分:1)

反序列化后,您可以使用指定的技术。以这种方式修改您的Result课程:

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

    [XmlIgnore]
    public bool SomeIntSpecified;
}

现在在Nullable类型的反序列化后使用此逻辑:

var value = SomeIntSpecified ? SomeInt : null;

或者您也可以在IXmlSerializable课程中实施Result

[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