嵌套对象未在xml文件中序列化

时间:2016-02-29 22:04:06

标签: wpf xml-serialization

这是我用来保存序列化数据的模型..当我运行主要属性(name,surname ..)时,从xml设置好,但是嵌套对象(检查)的属性(id,date,comment)为null在里面

代码中的哪些内容会解决这个问题?

namespace WpfApplication1
{
    [Serializable, XmlRoot("patients")]
    public class patients
    {
        [XmlElement("patient")]
        public List<patient> patients_list { get; set; }

    }
    public class patient
    {
        [XmlElement("firstname")]
        public string name { get; set; }
        [XmlElement("lastname")]
        public string surname { get; set; }
        [XmlElement("age")]
        public int age { get; set; }
        public string gender { get; set; }
        [XmlElement("exams")]
        public List<exam> exam { get; set; }

    }
    [XmlRoot("exams")]
    public class exam
    {
        [XmlElement("id")]
        public int id { get; set; }
        public DateTime date { get; set; }
        [XmlElement("comment")]
        public string comment { get; set; }
    }
}

和我的主要代码进行序列化:

System.Xml.Serialization.XmlSerializer reader =
                        new System.Xml.Serialization.XmlSerializer(typeof(patients));
                System.IO.StreamReader file = new System.IO.StreamReader("data.xml");
                var asd = (patients)reader.Deserialize(file);

和xml文件:

<patients>
 <patient>
    <firstname>Patience_name_1</firstname>
    <lastname>Patience_surname_1</lastname>
    <age>20</age>
    <gender>Male</gender>
    <exams>
      <exam>
        <id>1</id>
        <date>2/29/2016 12:18:44</date>
        <comment value="patiente">Exam completed for patience1</comment>
      </exam>
    </exams>
  </patient>
  <patient>
    <firstname>Patience_name_2</firstname>
    <lastname>Patience_surname_2</lastname>
    <age>22</age>
    <gender>Male</gender>
    <exams>
      <exam>
        <id>2</id>
        <date>2/29/2016 12:18:44</date>
        <comment value= "sdsad">Exam completed fro patience 2</comment>
      </exam>
    </exams>
  </patient>
  <patient>
    <firstname>Patience_name_3</firstname>
    <lastname>Patience_surname_3</lastname>
    <age>23</age>
    <gender>Female</gender>
    <exams>
      <exam>
        <id>3</id>
        <date>2/29/2016 12:18:44</date>
        <comment>Exam completed for patience 3</comment>
      </exam>
    </exams>
  </patient>
</patients>

1 个答案:

答案 0 :(得分:0)

您有以下问题:

  1. 您的exams列表的外容器元素<exams>包含每个项目的内部元素<exam>

    <exams>
      <exam>
        <!-- First exam data -->
      </exam>
      <exam>
        <!-- Second exam data if present -->
      </exam>
    <exams>
    

    要使用外部容器元素序列化列表,请使用XmlArrayXmlArrayItem

  2. 您的日期字符串不在ISO 8601 format之内。 XmlSerializer将尝试反序列化不以此格式的日期和时间字符串。为了更宽容,您需要创建一个字符串值的代理属性来反序列化日期。

    由于您的日期字符串不是ISO 8601格式,因此它不包含时区信息。您需要从XML提供程序确定日期字符串的时区! (或者更好的是让它们以适当的格式生成日期和时间。)

  3. 您的<comment>元素有一个属性"value",您没有反序列化:

    <comment value="patiente">Exam completed for patience1</comment>
    

    要捕获这个,您需要添加一个额外的类。

  4. 因此:

    [Serializable, XmlRoot("patients")]
    public class patients
    {
        [XmlElement("patient")]
        public List<patient> patients_list { get; set; }
    }
    
    public class patient
    {
        [XmlElement("firstname")]
        public string name { get; set; }
    
        [XmlElement("lastname")]
        public string surname { get; set; }
    
        [XmlElement("age")]
        public int age { get; set; }
    
        public string gender { get; set; }
    
        [XmlArray("exams")]
        [XmlArrayItem("exam")]
        public List<exam> exam { get; set; }
    }
    
    public class exam
    {
        [XmlElement("id")]
        public int id { get; set; }
    
        [XmlIgnore]
        public DateTime date { get; set; }
    
        [XmlElement("date")]
        public string DateString
        {
            get
            {
                return XmlConvert.ToString(date, XmlDateTimeSerializationMode.Utc);
            }
            set
            {
                // You will need to check whether the dates and times in your XML file are in universal time or local time!
                date = DateTime.Parse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
            }
        }
    
        [XmlElement("comment")]
        public Comment comment { get; set; }
    }
    
    public class Comment
    {
        [XmlAttribute("value")]
        public string Value { get; set; }
    
        [XmlText]
        public string CommentData { get; set; }
    }