假定应用程序的输入数据来自于一个结构化的XML文件,那么首先我们要根据需要的数据格式设计类型(class),其中要求类型中的公共属性能够被XML序列化,例如Dictionary<T,T>类型就不能直接被序列化而List<T>则能够。保存数据时,直接将类型实例序列化到外部XML文件中即可;读取时则反序列化,这样能够简化XML文件的读写逻辑,有利于应用程序的快速实现。举例如下:
下面的例子需要引用using System.IO和using System.Xml.Serialization命名空间。
1、设计类型:两个表示学生信息的简单类
/// <summary>
/// 一个学生信息类
/// </summary>
//无需[Serializable]特性声明
public class Student
{
public string Id { get; set; }
public string Name { get; set; }
public List<double> Scores { get; set; }
public Student()
{
Id = string.Empty;
Name = string.Empty;
Scores = new List<double>();
}
}
/// <summary>
/// 某个班级的学生信息类
/// </summary>
public class ClassStudents
{
public string Class { get; set; }
public List<Student> Students { get; set; }
public ClassStudents()
{
Class = string.Empty;
Students = new List<Student>();
}
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Student s1 = new Student() { Id = "101", Name = "李明" };
s1.Scores.Add(85);
s1.Scores.Add(90);
Student s2 = new Student() { Id = "102", Name = "张燕" };
ClassStudents students = new ClassStudents() { Class = "三年一班" };
students.Students.Add(s1);
students.Students.Add(s2);
//序列化XML
XmlSerializer xSer = new XmlSerializer(typeof(ClassStudents)); //创建序列化对象
using (FileStream fs = new FileStream("data.xml", FileMode.Create))
{
xSer.Serialize(fs, students); //将对象序列化到xml文件
}
//反序列化
using (FileStream fs = new FileStream("data.xml", FileMode.Open))
{
var sts = xSer.Deserialize(fs); //将xml文件反序列化到对象(ClassStudents类型)
}
}
3、XML文件
<?xml version="1.0"?>
<ClassStudents xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Class>三年一班</Class>
<Students>
<Student>
<Id>101</Id>
<Name>李明</Name>
<Scores>
<double>85</double>
<double>90</double>
</Scores>
</Student>
<Student>
<Id>102</Id>
<Name>张燕</Name>
<Scores />
</Student>
</Students>
</ClassStudents>