NET中对象序列化方法
毕业论文8.65K
摘 要 实现序列化最重要的两个原因是:将对象的状态保存在存储媒体中以便以后重新创建出完全相同的副本;按值将对象从一个应用程序域发送至另一个应用程序域。例如,序列化可用于在 中保存会话状态;将对象复制到 Windows 窗体的剪贴板中;它还可用于按值将对象从一个应用程序域远程传递至另一个应用程序域。本文简要介绍了 Microsoft 中使用的序列化。 关键词 ;序列化;封送
1 引言 序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。 在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中哪些字段需要序列化。以下各部分将探讨 框架提供的可靠的序列化机制,并着重介绍如何根据需要自定义序列化过程。2 持久存储 我们经常需要将对象的字段值保存到磁盘中,并在以后在内存中还原次对象。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。 公共语言运行时 (CLR) 管理对象在内存中的分布, 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其它实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的惟一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable。否则,当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时,将重新创建该类的对象,并自动还原所有数据成员的值。3 按值封送 按值封送是指将对象序列化为字节流,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个副本,这在COM技术中经常提到。在中,对象仅在创建对象的应用程序域中有效,除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable,否则,任何将对象作为参数传递或作为结果返回到另外一个应用程序域都将失败。 如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。如果对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换所有从 MarshalByRefObject 派生得到的对象。如果没有预先配置为 SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则。4 基本序列化 要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示:[Serializable]public class MyObject{public int n1 = 0;public int n2 = 0;public String str = null;}以下代码片段说明了如何将此类的一个实例序列化为一个文件:MyObject obj = new MyObject();obj.n1 = 1;obj.n2 = 24; = "一些字符串";IFormatter formatter = new BinaryFormatter();Stream stream = new FileStream("",te,e,);alize(stream,obj);e(); 本例使用二进制格式化程序进行序列化。只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中包括 private 变量的所有成员变量,都将被序列化,但这一点在本例中未明确体现出来。在这一点上,二进制序列化不同于只序列化公共字段的 XML 序列化程序。 将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。以下代码片段说明了如何进行此操作。IFormatter formatter = new BinaryFormatter();Stream stream = new FileStream("",,,);MyObject obj = (MyObject) rialize(fromStream);e();// 下面是证明eLine("n1:{0}",obj.n1);eLine("n2:{0}",obj.n2);eLine("str:{0}",); 上面所使用的 BinaryFormatter 效率很高,能生成非常紧凑的字节流。所有使用此格式化程序序列化的对象也可使用它进行反序列化,对于序列化将在 平台上进行反序列化的对象,此格式化程序是一个理想的工具。需要注意的是,对对象进行反序列化时并不调用构造函数。对反序列化添加这项约束,是出于性能方面的'考虑。但是,这违反了对象编写者通常采用的一些运行时约定,因此,开发人员在将对象标记为可序列化时,应确保考虑了这一特殊约定。
1 引言 序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。 在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中哪些字段需要序列化。以下各部分将探讨 框架提供的可靠的序列化机制,并着重介绍如何根据需要自定义序列化过程。2 持久存储 我们经常需要将对象的字段值保存到磁盘中,并在以后在内存中还原次对象。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。 公共语言运行时 (CLR) 管理对象在内存中的分布, 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其它实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的惟一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable。否则,当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时,将重新创建该类的对象,并自动还原所有数据成员的值。3 按值封送 按值封送是指将对象序列化为字节流,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个副本,这在COM技术中经常提到。在中,对象仅在创建对象的应用程序域中有效,除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable,否则,任何将对象作为参数传递或作为结果返回到另外一个应用程序域都将失败。 如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。如果对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换所有从 MarshalByRefObject 派生得到的对象。如果没有预先配置为 SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则。4 基本序列化 要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示:[Serializable]public class MyObject{public int n1 = 0;public int n2 = 0;public String str = null;}以下代码片段说明了如何将此类的一个实例序列化为一个文件:MyObject obj = new MyObject();obj.n1 = 1;obj.n2 = 24; = "一些字符串";IFormatter formatter = new BinaryFormatter();Stream stream = new FileStream("",te,e,);alize(stream,obj);e(); 本例使用二进制格式化程序进行序列化。只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中包括 private 变量的所有成员变量,都将被序列化,但这一点在本例中未明确体现出来。在这一点上,二进制序列化不同于只序列化公共字段的 XML 序列化程序。 将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。以下代码片段说明了如何进行此操作。IFormatter formatter = new BinaryFormatter();Stream stream = new FileStream("",,,);MyObject obj = (MyObject) rialize(fromStream);e();// 下面是证明eLine("n1:{0}",obj.n1);eLine("n2:{0}",obj.n2);eLine("str:{0}",); 上面所使用的 BinaryFormatter 效率很高,能生成非常紧凑的字节流。所有使用此格式化程序序列化的对象也可使用它进行反序列化,对于序列化将在 平台上进行反序列化的对象,此格式化程序是一个理想的工具。需要注意的是,对对象进行反序列化时并不调用构造函数。对反序列化添加这项约束,是出于性能方面的'考虑。但是,这违反了对象编写者通常采用的一些运行时约定,因此,开发人员在将对象标记为可序列化时,应确保考虑了这一特殊约定。
-
建筑工程财务风险控制体系探讨
建立健全财务风险控制体系的最根本的目的就是通过采取一系列的措施来保持建筑工程财务活动的动态平衡,在合理的范围内控制建筑工程中所涉及的全部花销,从而降低财务预算与实际支出之间的差距。摘要:建筑工程由于其特殊性的限制,导致在项目进行中的任何环节出现任...
-
区域产业经济论文
加快区域产业结构调整升级,促进区域产业高级化与合理化。那么,如何快速发展区域产业经济呢?一技术进步对经济增长的测度分析所使用的数据取自甘肃省2002—2011年的数据,数据来源于《甘肃省统计年鉴》。用甘肃省GDP表示总产出水平,由于各地区就业或劳务人口统计...
-
浅析行动学习法对供电企业班组长培训的重要性
论文摘要:行动学习是一种团队学习的形式。针对工作中的实际问题,团队成员通过充分的交流、质疑、反思,寻找解决工作难题的切实可行的方法。班组是供电企业最基本的细胞,班组长担当了承上启下的角色,引入行动学习的方法可以彻底解决“培训无法落地”的难题,有效提升班...
-
论基于中学生英语交际学习策略指导
论文关键词:初中英语英语交际策略指导论文摘要:本文试就中学生的英语交际学习策略指导作探析,旨在通过运用正确的教学思维模式来提高学生的语言交际和表达技能,从而提高他们的综合语言运用能力。交际策略的指导,不仅是英语课程本质功能的发展必然要求,更是提高学生语...