序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。
.NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。 可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。
1.BinaryFormatter
命名空间:System.Runtime.Serialization.Formatters.Binary;
下面先定义一个可序列化类:
[Serializable] // 表示该类可被序列化 class Peoson { public Peoson() { } public Peoson( string name, int age) { this .name = name; this .age = age; } private string name; public string Name { get { return name; } set { name = value; } } [NonSerialized] // 表示下面这个age字段不进行序列化 private int age; public int Age { get { return age; } set { age = value; } } public void SayHi() { Console.WriteLine( " 大家好,我是{0},今年{1}岁 " ,name,age); } }
Main函数中:
List < Peoson > listPers = new List < Peoson > (); Peoson per1 = new Peoson( " 张三 " , 18 ); Peoson per2 = new Peoson( " 李四 " , 20 ); listPers.Add(per1); listPers.Add(per2); SerializeMethod(listPers); // ReserializeMethod(); // 反序列化成把上面一行注释掉 执行此行 Console.ReadKey();
序列化和反序列化的方法:
static void ReserializeMethod() { // 反序列化 using (FileStream fs = new FileStream( " 1.bin " , FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); List < Peoson > list = bf.Deserialize(fs) as List < Peoson > ; if (list != null ) { for ( int i = 0 ; i < list.Count; i ++ ) { list[i].SayHi(); } } } } static void SerializeMethod(List < Peoson > listPers) { // 序列化 using (FileStream fs = new FileStream( " 1.bin " , FileMode.Create)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, listPers); } } }
反序列化输出结果:
大家好,我是张三,今年0岁
大家好,我是李四,今年0岁
由此看出,未序列化的字段存储的值为空。
2、使用XmlSerializer进行串行化
关于格式化器还有一个问题,假设我们需要XML,有两中方案:要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFormatter类,但是没有你不需要的信息;要么使用库类XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。
如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:
a.添加System.Xml.Serialization命名空间。
b.Serializable和NoSerialized属性将被忽略,而是使用XmlIgnore属性,它的行为与NoSerialized类似。
c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经满足了。
序列化:
XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
xs.Serialize(fs, listPers);
反序列化:
XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
List<Peoson> list = xs.Deserialize(fs) as List<Peoson>;