序列化和反序列化

上传人:ail****e3 文档编号:50636852 上传时间:2022-01-21 格式:DOC 页数:3 大小:22KB
返回 下载 相关 举报
序列化和反序列化_第1页
第1页 / 共3页
序列化和反序列化_第2页
第2页 / 共3页
序列化和反序列化_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述
一、概述当两个进程在进行远程通信时, 彼此可以发送各种类型的数据。 无论是何种类型的数据, 都会以二进制序列的形式在网络上传送。 发送方需要把这个对象转换为字节序列, 才能在网 络上传送;接收方则需要把字节序列再恢复为对象。把对象转换为字节序列的过程称为对象的序列化 。把字节序列恢复为对象的过程称为对象的反序列化 。二、对象的序列化主要有两种用途:1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 ; 我们经常需要将对象的字段值保存到磁盘中, 并在以后检索此数据。 尽管不使用序列化 也能完成这项工作, 但这种方法通常很繁琐而且容易出错, 并且在需要跟踪对象的层次结构 时,会变得越来越复杂。 可以想象一下编写包含大量对象的大型业务应用程序的情形, 程序 员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁 盘还原这些字段 和属性。序列化提供了轻松实现这个目标的快捷方法。公共语言运行时 (CLR) 管理对象在 内存中的分布, .NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名 称、程序集以及类实例的所有数据成员均被写入存储媒体中。 对象通常用成员变量来存储对 其他实例的引用。 类序列化后, 序列化引擎将跟踪所有已序列化的引用对象, 以确保同一对 象不被序列化多次。 .NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环 引用。对对象图表的唯一要求是, 由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable (请参阅基 本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出 现异常。当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。2) 在网络上传送对象的字节序列。对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject 派生得到或 标记为 Serializable ,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。 如果对象标记为 Serializable ,则该对象将被自动序列化, 并从一个应用程序域传输至另一个 应用程序域, 然后进行反序列化, 从而在第二个应用程序域中产生出该对象的一个精确副本。 此过程通常称为按值封送。如果对象是从 MarshalByRefObject 派生得到,则从一个应用程 序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从 MarshalByRefObject 派生得到的对象标记为Serializable 。远程使用此对象时, 负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换所 有从MarshalByRefObject派生得到的对象。如果没有预先配置为Surrogateselector,序列化体系结构将遵从下面的标准序列化规则 .三、.NET 提供了三种序列化方式1 、 XML Serializer2 、SOAP Serializer3 、 BinarySerializer四、基本序列化要使一个类可序列化, 最简单的方法是使用 Serializable 属性对它进行标记, 如下所示: Serializablepublic class MyObjectpublic int n1 = 0; public int n2 = 0; public String str = null;BinarySerializer将此类的一个实例序列化为一个文件: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 文件 .XmlSerializer ser = new XmlSerializer(obj.GetType();ser.Serialize(new FileStream(users.xml, FileMode.Create), obj);反序列化 :XmlSerializer serializer = new XmlSerializer(Type.GetType(MyObject);MyObject my=(MyObject)serializer.Deserialize(new FileStream(users.xml,FileMode.Open);说明 :使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的 实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此 调用。类中的所有成员变量(甚至标记为 private 的变量)都将被序列化,但这一点在本例 中未明确体现出来。在这一点上,二进制序列化不同于只序列化公共字段的 XML 序列化 程序。 将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然 后让格式化程序对对象进行反序列化。SOAP Serializer如果要求具有可移植性,请使用SoapFormatter 。所要做的更改只是将以上代码中的BinaryFormatter 换 SoapFormatter ,而 Serialize 和 Deserialize 调用不变。什么叫深序列化,什么叫浅序列化? 所谓深序列化就是序列化对象中所有的公有, 私有成员; 浅序列化就是只序列化对象的公有 成员了。比如: SoapFormatter ,BinaryFormatter 就是深序列化 ,XmlSerializer 是浅序列化;在 实际开发时要注意其名称空间的使用,一般都包括以下一些名称空间:System.Runtime.Serialization.Formatters.Binary;System.Runtime.Serialization.Formatters.Soap;System.Runtime.Serialization;System.IO;System.Xml.Serialization;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 演讲稿件


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!