这是我用来保存序列化数据的模型..当我运行主要属性(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>
答案 0 :(得分:0)
您有以下问题:
您的exams
列表的外容器元素<exams>
包含每个项目的内部元素<exam>
:
<exams>
<exam>
<!-- First exam data -->
</exam>
<exam>
<!-- Second exam data if present -->
</exam>
<exams>
要使用外部容器元素序列化列表,请使用XmlArray
和XmlArrayItem
。
您的日期字符串不在ISO 8601 format之内。 XmlSerializer
将尝试反序列化不以此格式的日期和时间字符串。为了更宽容,您需要创建一个字符串值的代理属性来反序列化日期。
由于您的日期字符串不是ISO 8601格式,因此它不包含时区信息。您需要从XML提供程序确定日期字符串的时区! (或者更好的是让它们以适当的格式生成日期和时间。)
您的<comment>
元素有一个属性"value"
,您没有反序列化:
<comment value="patiente">Exam completed for patience1</comment>
要捕获这个,您需要添加一个额外的类。
因此:
[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; }
}