我从第三方得到一个xml,我需要将它反序列化为C#对象。此xml可能包含整型或空值的属性:attr=“11”或attr=“”。我希望将此属性值反序列化为可为空的整数类型的属性。但是XmlSerializer不支持反序列化为可空类型。以下测试代码在使用InvalidOperationException {“反映类型'TestConsoleApplication.SerializeMe'."}创建XmlSerializer时失败。
[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:
文档(%1,% 16)中存在错误。
有谁能建议如何将空值的属性反序列化为可空类型(如null),同时将非空属性值反序列化为整数?有什么技巧可以解决这个问题,这样我就不需要手动对每个字段进行反序列化(实际上有很多字段)?
来自ahsteele的评论后更新:
据我所知,此属性仅适用于XmlElementAttribute -此属性指定元素没有内容,无论是子元素还是正文。但我需要为XmlAttributeAttribute找到解决方案。无论如何,我不能更改xml,因为我无法控制it.
仅当属性值非空或缺少属性时,此属性才有效。当attr具有空值(attr='')时,XmlSerializer构造函数将失败(正如预期的那样)。
public类元素{XmlAttribute(“}
我试着采用这篇博客文章中的类来解决我的问题:
XmlAttribute("attr")公共NullableInt值{ get;set;}
但使用InvalidOperationException时,XmlSerializer构造函数会失败:
无法序列化类型为TestConsoleApplication.NullableInt的成员“Value”。
XmlAttribute/XmlText不能用于编码实现IXmlSerializable }的类型
公共类元素{ XmlAttribute("attr")公共字符串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接口。
目前看来,我必须为整个Element类实现IXmlSerializable (它很大),并且没有简单的变通方法…
https://stackoverflow.com/questions/1295697
复制相似问题