假定應用程序的輸入數據來自於一個結構化的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>