第13章 对象的复制与序列化
【简介】:序列化技术是学习分布式软件系统开发技术(如WCF)的前提之一,本章主要介绍对象的浅复制与深复制、对象的序列化、对象序列化应用等。
第一节 对象的浅复制与深复制
1、 浅复制:是指当对象的字段值被复制时,字段引用的对象不会被复制。
例如,如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅复制,那麽两个对象将引用同一个字符串。
2、 深复制:是对对象事例中字段引用的对象也进行复制的一种方式。
例如,如果一个对象有一个指向字符串的字段,并且对该对象做了一个深复制的话.我门将创建一个新的对象和一个新的字符串.新对象将指向新字符串。
3、.NET中默认的对象复制方式为浅复制,我们可以通过两种方式实现深复制。
A、类实现Icloneable接口。
B、对象序列化技术。
第二节 对象序列化
对象序列化主要解决对象状态的保存问题,而对象状态指某一时刻对象所拥有的各个字段的集合。
1、 定义:将一个内存中的对象保存到流中,并在需要时从流中重新读取数据重建对象的过程称为对象的序列化与反序列化。
用于保存对象序列化的存储介质是流(Stream),它代表一连串有顺序的二进制数据。
2、.NET基类库的流类型有:NetworkStream、FileStream、PipeStream、MemoryStream。它们的父类为Stream。
3、读写流中的数据的两组辅助类:
A、BinaryReader 和 BinaryWriter
B、StreamReader 和 StreamWriter
4、序列化有两种形式:二进制序列化与XML序列化。
前者指将对象的数据以二进制形式直接写入流中,后者指用XML方式写入流中。其中XML序列化速度较慢、生成的数据量较大、安全性不如二进制序列化。
5、BinaryFormatter类进行二进制序列化,SoapFormatter类进行XML序列化。
6、.NET中提供标记可控制序列化(或反序列化)过程。
A、[OnSerializedAttribute]:在序列化完成后调用。
B、[OnSerializingAttribute]:在序列化进行时调用。
C、[OnDeserializedAttribute]:在反序列化完成后调用。
D、[OnDeserializingAttribute]:在反序列化进行时调用。
E、[NonSerialized]:指字段不参与序列化。
第三节 对象序列化技术应用实例
1、可大批量地复制对象。
要点:不将其序列化到文件中,而将其序列化到内存流中。此完成的是“深复制”。
2、程序退出时保存状态。
3、WPF对象的XAML序列化。
XAML代码可看成是WPF对象序列化后的结果。
4、ASP.NET视图状态剖析:
正是借助序列化技术,解决了asp.net中对象(控件)状态保存的问题。