[XmlRoot("root")] public class SerializeMe { [XmlElement("element")] public Element Element { get; set; } } public class Element { [XmlAttribute("attr")] public int? Value { get; set; } } class Program { static void Main(string[] args) { string xml = "<root><element attr=''>valE</element></root>"; var deserializer = new XmlSerializer(typeof(SerializeMe)); Stream xmlStream = new MemoryStream(Encoding.ASCII.GetBytes(xml)); var result = (SerializeMe)deserializer.Deserialize(xmlStream); } }
当我将“Value”属性的类型更改为int时,反序列化失败,并返回InvalidOperationException:
There is an error in XML document (1,16).
任何人可以建议如何反序列化属性与空值为可空类型(作为null)同时反序列化非空的属性值为整数?有这里的任何技巧,所以我不必手动地做每个字段反序列化(实际上有很多他们)?
更新后,从ahsteele的注释:
据我所知,这个属性只适用于XmlElementAttribute – 此属性指定元素没有内容,无论是子元素还是主体文本。但我需要找到XmlAttributeAttribute的解决方案。反正我不能改变xml,因为我没有控制它。
> bool *Specified property
此属性仅在属性值非空或属性缺失时工作。当attr具有空值(attr =”)时,XmlSerializer构造函数失败(如预期的那样)。
public class Element { [XmlAttribute("attr")] public int Value { get; set; } [XmlIgnore] public bool ValueSpecified; }
> Custom Nullable class like in this blog post by Alex Scordellis
我试图采纳从这篇博客的类到我的问题:
[XmlAttribute("attr")] public NullableInt Value { get; set; }
但XmlSerializer构造函数失败,并返回InvalidOperationException:
Cannot serialize member ‘Value’ of type TestConsoleApplication.NullableInt.
XmlAttribute/XmlText cannot be used to encode types implementing IXmlSerializable }
public class Element { [XmlAttribute("attr")] public string SetValue { get; set; } public int? GetValue() { if ( string.IsNullOrEmpty(SetValue) || SetValue.Trim().Length <= 0 ) return null; int result; if (int.TryParse(SetValue,out result)) return result; return null; } }
但我不想提出这样的解决方案,因为它打破了我的类的消费者的接口。我最好手动实现IXmlSerializable接口。
目前,它看起来像我必须实现IXmlSerializable为整个Element类(它是大),没有简单的解决方法…
[XmlIgnore] public int? Age { get; set; } [XmlElement("Age")] public string AgeAsText { get { return (Age.HasValue) ? Age.ToString() : null; } set { Age = !string.IsNullOrEmpty(value) ? int.Parse(value) : default(int?); } }