使用多个元素属性反序列化XML文件 – 属性不反序列化

使用C#.Net 4 – XML示例(Real示例有6个属性)

 25  

对于我的class级定义,我有以下内容:

 public class TestXML() { public TestXML() {} public int TestElement {get; set;} [XmlAttribute] public string attr1 {get; set;} [XmlAttribute] public string attr2 {get; set;} [XmlIgnore] public DateTime DateAdded {get; set;} [XmlAttribute("DateAdded")] public string dateadded { get{ return (DateAdded == null ? "" : DateAdded.ToString();} set{ if(!value.Equals("")) DateAdded = DateTime.Parse(value);} } } 

现在反序列化的代码:

 string xml = "26" using (StringReader sr = new StringReader(xml)) { XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); TestXML myxml = (TestXML)serializer.Deserialize(sr); } 

现在我们得到的结果是(在VS中查看对象):

 myxml attr1 | null attr2 | null TestElement | 25 

完全丧失了为什么属性不会反序列化。

要做到这一点,你需要两个层次:

 [XmlRoot("TestXML")] public class TestXml { [XmlElement("TestElement")] public TestElement TestElement { get; set; } } public class TestElement { [XmlText] public int Value {get;set;} [XmlAttribute] public string attr1 {get;set;} [XmlAttribute] public string attr2 {get;set;} } 

注意> 26 <也可能导致问题(空白); 您可能需要将其作为字符串而不是int。

您在TestElement上定义属性,而它们应该在TestXML 。 例:

 @" 26 " 

我刚刚运行了一个测试序列化/反序列化你的对象,它似乎工作正常

测试:

 TestXML obj = new TestXML{ attr1 = "Attrib1", attr2 = "Attrib2", DateAdded = DateTime.Now, TestElement = 44}; XmlSerializer serializer = new XmlSerializer(typeof(TestXML)); using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.OpenOrCreate)) { serializer.Serialize(stream, obj); } using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.Open)) { TestXML myxml = (TestXML)serializer.Deserialize(stream); } 

所有属性反序列化确定。

结果:

在此处输入图像描述

XML:

   44  

作为接受答案的补充说明。 确保xml元素不包含nil =“true”属性,如下所示:

  25  

根据我的经验,反序列化器不会反序列化标记为null(nil)的元素的属性。