一,为什么需要序列化
当程序运行时,需要访问和处理数据,在面向对象编程中,这些数据通常保存在对象中,当程序关闭或对象销毁时,这些数据需要保存到某处以便日后重建对象时能够还原对象的状态。
将对象及其状态保存起来,就称作序列化(Serialization),最简单和最常见的一种情况就是将对象及其状态保存在文件中;
而反序列化是序列化的反向操作,将文件还原为对象。
二,BinaryFormatter实现序列化
.net提供了一个接口和类如下表:
IFormatters |
|
|
IFormatter中最重要的两个方法就是Serialize()和Deserialize,分别用于序列化和反序列化,由于它们接收的是Stream基类,因此可以序列化到任何流类中,而不仅限于文件流。 |
|
Formatters |
|
命名空间提供序列化格式化程序所使用的常见枚举、接口和类。
来自 <http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.formatters(v=vs.110).aspx>
|
|
|
Binary |
用于将序列化对象转化为二进制数据 |
|
|
Soap |
用于将对象序列化为人类直接可读的文本格式(需添加对此Dll的引用); //这个文本是用soap来描述的。 //SOAP全称为简单对象访问协议(simple object access Protocol),是一种轻量级的,基于XML的协议。 |
实现序列化代码:
注:序列化不光需要该类型是标记Serializable的,类型中的属性和字段也需要是可序列化的。
如果要序列化的对象中加入了一个不可序列化的属性,那么,序列化的时候要把它排除在外。[NonSerialized]
[NonSerialized]只能加在字段上,不能加在属性上;
结果:
三,BinaryFormatter实现反序列化
出现问题:
//Conn变成了null,
//由于conn没有进行序列化,使序列化前对象的状态和反序列化后得到的对象的状态不一致。
//.NET中提供了IDeserializationCallback接口来完成这件事。
为了避免此问题:我们使用IDserializationCallBack接口:
然后实现接口的方法:
再次运行之后,我们会发现conn不再是null了,而是一个object.
四,使用SoapFormatter类实现序列化
首先比较下与BinaryFormatter异同
1,使用方式完全相同;
2,优点:
可以跨平台;
因为SOAP是一个开放的协议,所以使用非Windows平台下的其他程序也可以处理它。
3,缺点:
SOAP是用XML来描述的,因此文件尺寸比较大。
序列化完成之后的结果,如下图所以,打开后可以看出为XML: