在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; }
}
答案 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
}