xml序列化与反序列化
一.概述
序列化是将一个对象(object)转换成容易传输的形式,可以理解成解释。反序列化的过程正好相反。例如在客户端和服务器端需要传输一个object对象,那么就可以在服务器端将这个对象先序列化成流形式,在传递给客户端,客户端在接收到流后,在进行反序列化的过程,重构object。
xml序列化只能转换public成员(字段)和可读写属性,不可以转换方法,索引,私有成员(字段)或者只读属性。所以为了序列化object所有的public或者private成员,方法和属性,可以使用DataContractSerializer来代替XML序列化。这节内容就不讲DataContractSerializer了。
二.举例说明
这里我只举例说明如何转换类对象,需要注意的是只能转换public object。
首先是Person类,就是我们需要序列化与反序列化的对象,是一个public类。
public class Person
{
public Person(){}
public Person(string name, int age, string job)
{
this.name = name;
this.age = age;
this.job = job;
}
public string name;
public int age;
private string job;
public string GetJob() { return job; }
}
然后是序列化与反序列化操作。先构建XmlSerializer对象,然后借助该对象的Serialize方法和Deserialize方法进行序列化与反序列化。
static void SerializationPerson(string file)
{
XmlSerializer serializer = new XmlSerializer(typeof(Person));
TextWriter writer = new StreamWriter(file);
Person twj = new Person("唐维娟", 25, "建筑师");
serializer.Serialize(writer, twj);
writer.Close();
}
static void DeserializationPerson(string file)
{
XmlSerializer serializer = new XmlSerializer(typeof(Person));
FileStream fs = new FileStream(file, FileMode.Open);
Person twj = new Person();
twj = (Person)serializer.Deserialize(fs);
Console.WriteLine("姓名:" + twj.name);
Console.WriteLine("年龄:" + twj.age);
Console.WriteLine("职业:" + twj.GetJob());
}
调用执行:
static void Main(string[] args)
{
SerializationPerson("C:/Users/a/Desktop/test.txt");
DeserializationPerson("C:/Users/a/Desktop/test.txt");
}
下面是结果:
从结果中可以看出,Person的私有成员job并没有被序列化,从而造成数据丢失。如果想要序列化私有成员,需要使用DataContractSerializer。
xml序列化,不仅能序列化类对象,还可以序列化DataSet,XmlElement和XmlNode等等,如果想进一步学习可以参考微软官方文档。