首页 > 代码库 > 序列化与反序列化基本操作

序列化与反序列化基本操作

一,为什么需要序列化

 

    当程序运行时,需要访问和处理数据,在面向对象编程中,这些数据通常保存在对象中,当程序关闭或对象销毁时,这些数据需要保存到某处以便日后重建对象时能够还原对象的状态。

 

    将对象及其状态保存起来,就称作序列化(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:



技术分享

 

 

 

 

 

序列化与反序列化基本操作