.Net 中的序列化与反序列化

1、概述
当两个进程在进行远程通讯时,彼此能够发送各类类型的数据。不管是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方须要把这个对象转换为字节序列,才能在网络上传送;接收方则须要把字节序列再恢复为对象。
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。

2、对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,一般存放在一个文件中;
咱们常常须要将对象的字段值保存到磁盘中,并在之后检索此数据。尽管不使用序列化也 能完成这项工做,但这种方法一般很繁琐并且容易出错,而且在须要跟踪对象的层次结构时,会变得愈来愈复杂。能够想象一下编写包含大量对象的大型业务应用程 序的情形,程序员不得不为每个对象编写代码,以便将字段和属性保存至磁盘以及从磁 盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则经过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的全部数据成员均被写入存储媒体中。对象一般用成员变量来存储对其余 实例的引用。类序列化后,序列化引擎将跟踪全部已序列化的引用对象,以确保同一对象不被序列化屡次。.NET 框架所提供的序列化体系结构能够自动正确处理对象图表和循环引用。对对象图表的惟一要求是,由正在进行序列化的对象所引用的全部对象都必须标记为 Serializable(请参阅基 本序列化)。不然,当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时,将从新建立该类,并自动还原全部数据成员的值。
2) 在网络上传送对象的字节序列。
对象仅在建立对象的应用程序域中有效。除非对象是从 MarshalByRefObject派生获得或标记为 Serializable,不然,任何将对象做为参数传递或将其做为结果返回 的尝试都将失败。若是对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另外一个应用程序域,然 后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程一般称为按值封送。若是对象是从MarshalByRefObject派生 获得,则从一个应用程序域传递至另外一个应用程序域的是对象引用,而不是对象自己。也能够将从MarshalByRefObject派生获得的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为SurrogateSelector的格式化程序将控制序列化过程,并用一个 代理替换全部从MarshalByRefObject派生获得的对象。若是没有预先配置为SurrogateSelector,序列化体系结构将听从下面 的标准序列化规则.

3、.NET提供了三种序列化方式
[1]、XML Serializer
[2]、SOAP Serializer
[3]、BinarySerializer

4、基本序列化
要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,以下所示:
[Serializable]
public class MyObject
{
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
[BinarySerializer]
将此类的一个实例序列化为一个文件:
html

MyObject obj =new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "一些字符串";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create,
FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
程序员

反序列化:网络

IFormatter formatter =new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open,
FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(fromStream);
stream.Close();
框架

[XMLSerializer]
将此类的实例序列化成一个Xml文件.spa

XmlSerializer ser =new XmlSerializer(obj.GetType());
ser.Serialize(new FileStream(@"users.xml", FileMode.Create), obj);
代理

反序列化:orm

XmlSerializer serializer =new XmlSerializer(Type.GetType("MyObject"));
MyObject my=(MyObject)serializer.Deserialize(new FileStream(@"users.xml",FileMode.Open));
xml

说明:使用二进制格式化程序进行序列化。您只需建立一个要使用的流和格式化程序的实例,而后 调用格式化程序的 Serialize 方法。流和要序列化的对象实例做为参数提供给此调用。类中的全部成员变量(甚至标记为 private 的变量)都将被序列化,但这一点在本例中未明确体现出来。在这一点上,二进制序列化不一样于只序列化公共字段的 XML 序列化程序。将对象还原到它之前的状态也很是容易。首先,建立格式化程序和流以进行读取,而后让格式化程序对对象进行反序列化。
[SOAP Serializer]
若是要求具备可移植性,请使用 SoapFormatter。所要作的更改只是将以上代码中的BinaryFormatter换 SoapFormatter,而 Serialize 和 Deserialize 调用不变。
htm

 

http://www.cnblogs.com/chjw8016/archive/2008/02/23/1078204.html对象

相关文章
相关标签/搜索