博客园手机版.docx

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
博客园手机版 、概述 当两个进程在进行远程通信时,彼此可以发送各种类型 的数据。无论是何种类型的数据,都会以二进制序列的形式 在网络上传送。发送方需要把这个对象转换为字节序列,才 能在网络上传送;接收方则需要把字节序列再恢复为对象。 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 二、对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 在一个文件中; 我们经常需要将对象的字段值保存到磁盘中,并在以后 检索此数据。尽管不使用序列化也能完成这项工作,但这种 方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次 结构时,会变得越来越复杂。可以想象一下编写包含大量对 象的大型业务应用程序的情形,程序员不得不为每一个对象 这些字段和属性。序列化提供了轻松实现这个目标的快捷方 法。公共语言运行时 (CLR) 管理对象在内存中的分布, .NET 编写代码,以便将字段和属性保存至磁盘以及从磁盘还原 编写代码,以便将字段和属性保存至磁盘以及从磁 盘还原 框架则通过使用反射提供自动的序列化机制。对象序列化后, 类的名称、程序集以及类实例的所有数据成员均被写入存储 媒体中。对象通常用成员变量来存储对其他实例的引用。类 序列化后,序列化引擎将跟踪所有已序列化的引用对象,以 确保同一对象不被序列化多次。 .NET 框架所提供的序列化 体系结构可以自动正确处理对象图表和循环引用。对对象图 表的唯一要求是,由正在进行序列化的对象所引用的所有对 象都必须标记为 Serializable (请参阅基 本序列化)。否则, 当序列化程序试图序列化未标记的对象时将会出现异常。当 反序列化已序列化的类时,将重新创建该类,并自动还原所 有数据成员的值。 2) 在网络上传送对象的字节序列。 对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable ,否则, 任何将对象作为参数传递或将其作为结果返回的尝试都将 失败。如果对象标记为 Serializable ,则该对象将被自动序 列化,并从一个应用程序域传输至另一个应用程序域,然后 进行反序列化,从而在第二个应用程序域中产生出该对象的 个精确副本。此过程通常称为按值封送。如果对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至 另一个应用程序域的是对象引用,而不是对象本身。也可以 将从 MarshalByRefObject 派生得到的对象标记为 Serializable 。远程使用此对象时,负责进行序列化并已预先 配置为 SurrogateSelector 的格式化程序将控制序列化过程, 件 件 .XmlSerializer ser = new XmlSerializer(obj.GetType()); 并用一个代理替换所有从 MarshalByRefObject 派生得到的 对象。 如果没有预先配置为 SurrogateSelector ,序列化体系 结构将遵从下面的标准序列化规则 四、基本序列化要使一个类可序列化,最简单的方法 四、基本序列化 要使一个类可序列化,最简单的方法 是使用 Serializable 属性对它进行标记,如下所示: [Serializable] public class MyObject { public 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(fro

文档评论(0)

wangyueyue + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档