1、第第7章章数据的序列化数据的序列化.NET Framework 2.0 程序设计程序设计第第 1 章章:.NET Framework 2.0简介简介 第第 2 章:公共语言运行库和章:公共语言运行库和类型类型 第第 3 章:托管代码的编译和章:托管代码的编译和执行执行 第第 4 章:委托和事件章:委托和事件 第第 5 章:读取和写入文件章:读取和写入文件 第第 6 章:集合和泛型章:集合和泛型 第第 7 章:章:数据的序列化数据的序列化 第第 8 章:章:GDI+第第 9 章章:在在.NET Framework 2.0中实现加密中实现加密第第 10 章:章:COM 组件与组件与.NET Fra
2、mework程序集之间的交程序集之间的交互操作互操作 第第 11 章:使用类型元数据章:使用类型元数据 第第 12 章:创建多线程应用章:创建多线程应用程序和应用程序域程序和应用程序域 第第 13 章:代码访问安全性章:代码访问安全性 第第 14 章:监视和调试应用章:监视和调试应用程序程序 第第 15 章:使用服务应用程章:使用服务应用程序和电子邮件消息序和电子邮件消息 第第 16 章:创建全球化应用章:创建全球化应用程序程序 第第 17 章:配置和安装程序章:配置和安装程序集集 本章学习目标:本章学习目标:通过通过 BinaryFormatter 类和类和 SoapFormatter 类,
3、将类,将对象序列化为二进制格式和对象序列化为二进制格式和 SOAP 格式格式 通过通过 XmlSerializer 类、类、IXmlSerializable接口及接口及 XML 序列化属性和委托,将对象序列化为自定序列化属性和委托,将对象序列化为自定义义 XML 格式格式创建自定义序列化类创建自定义序列化类 目标目标 生成序列化的二进制格式和生成序列化的二进制格式和 SOAP 格式格式生成序列化的生成序列化的 XML 格式格式创建自定义序列化类创建自定义序列化类 小结小结实验实验习题习题第第7章章 数据的序列化数据的序列化生成序列化的二进制生成序列化的二进制格式和格式和 SOAP 格式格式 7
4、.1生成序列化的二进制生成序列化的二进制格式和格式和 SOAP 格式格式对象数据的传输对象数据的传输 序列化和反序列化序列化和反序列化 代码示例代码示例VBBinaryFormatter类的成员类的成员 BinaryFormatter类的成员类的成员 7.1.1 BinaryFormatter类的成员类的成员成员描述AssemblyFormat 属性AssemblyFormat 属性定义或返回用于序列化程序集名称的程序集格式。该返回值取决于 FormatterAssemblyStyle 枚举(拥有两个成员:Full 和 Simple)的值。在程序集格式为Full 的情况下,程序集描述包括程序集
5、名称、所保存的对象的全球文化以及程序集的版本和公钥标志。在程序集格式为Simple 的情况下,程序集描述仅由程序集名称组成。Binder 属性Binder 属性定义或返回一个SerializationBinder 类的对象,该对象用于控制将序列化对象绑定到类型的过程。这里,类型是指在序列化过程中用于加载序列化对象的自定义类型,而非该序列化对象的实际类型。在对象被反序列化时,这将有助于你选择所要的对象类型。例如,雇员信息原来以Employee 类型进行保存,稍后,由于雇员要从公司商店购买一些产品,所以要序列化该雇员信息。因此,你需要将该雇员信息以Customer 类型进行反序列化。通过 Seri
6、alizationBinder类可加载自定义类型,以替代由序列化引擎执行的默认加载,这意味着可以更改序列化对象的默认行为。另外,还可以通过使用 SerializationBinder 来检查应用程序域中加载的类型。这将有助于维护包含拒绝类型的黑名单和允许类型的白名单,并限制被加载和实例化的类型。BinaryFormatter类的类的成员成员(续)(续)7.1.1 BinaryFormatter类的成员类的成员Context 属性Context 属性定义或返回 BinaryFormatter 的 StreamingContext。StreamingContext 结构指示格式化程序所使用的位的源
7、或目标。FilterLevel 属性FilterLevel 属性定义或返回 BinaryFormatter 所执行的自动反序列化的 TypeFilterLevel 枚举类型的值。该值取决于 TypeFilterLevel 枚举所指定的值,可为 Low 或 Full。Low反序列化级别是.NET Framework 中的默认值。它仅对与最基本的远程处理功能相关联的类型进行反序列化,从而抵御反序列化攻击。反序列化攻击允许未授权用户拦截消息,并读取或更改该消息中的信息。Low 反序列化级别支持的类型有:远程处理基础结构对象、基元类型、引用类型以及值类型。Full 反序列化级别支持对所有这些类型的自动
8、反序列化,即在任何情况下受远程处理支持的类型。续表续表:SurrogateSelector 属性SurrogateSelector 属性定义或返回 ISurrogateSelector 接口,以控制序列化和反序列化过程中的类型替换。ISurrogateSelector 接口属于 System.Runtime.Serialization 命名空间。使用 SurrogateSelector属性,未标记为可序列化的对象也可被序列化。假设一个示例,其中你创建一个 Customer 类型的对象,但是不能将其标记为 Serializable。因此,你创建一个ISurrogateSelector 接口的类型
9、,并将SurrogateSelector属性设置为该类型的对象,以将 Customer 类型指向到已标记为可序列化的Person 类型。这允许序列化对象的 Customer 类型。TypeFormat 属性TypeFormat 属性定义或返回类型说明在序列化流中的布局格式。该属性接收一个 FormatterTypeStyle 枚举类型的值,该枚举类型拥有以下成员:TypesAlways:指示可为所有对象和 ISerializable 对象成员提供类型。TypesWhenNeeded:指示只能为对象数组、Object类型的对象成员以及 ISerializable 非基元值类型(例如结构和枚举)声
10、明类型。XsdString:指示可以 XSD 格式(而非 SOAP 格式)提供字符串。7.1.1 BinaryFormatter类的成员类的成员续表续表续表续表:DeSerialize 方法DeSerialize 方法将指定的流反序列化为对象图。如果反序列化成功,则该流中的当前位置必须位于对象图的开头。该方法将返回该对象图的顶级对象。Deserialize 方法拥有两种重载形式:BinaryFormatter.Deserialize(Stream):此形式将指定的流反序列化为对象图。BinaryFormatter.Deserialize(Stream,HeaderHandler):此形式也将指
11、定的流反序列化为对象图。另外,此形式中提供的 HeaderHandler 参数将处理该流中的所有标题对象。标题对象传达关于远程函数调用的信息。标题对象的一些例子包括事务ID 或方法签名。如果创建 HeaderHandler,则需要确定要处理该事件的方法。Serialize 方法Serialize 方法将对象或具有指定头的对象图序列化为给定的流。Serialize 方法拥有以下两种重载形式:BinaryFormatter.Serialize(Stream,Object):此形式将对象或具有指定头的对象图序列化为给定的流。BinaryFormatter.Serialize(Stream,Objec
12、t,Header):此形式通过附加所提供的标题,也将对象或具有指定头的对象图序列化为给定的流。所包括的标题将有助于传输关于消息如何处理的信息。序列化进程包含序列化流的开始处的标题参数所提供的信息。7.1.1 BinaryFormatter类的成员类的成员续表续表续表续表:SoapFormatter类的成员类的成员 SoapFormatter类的成员类的成员 7.1.2 SoapFormatter类的成员类的成员成员描述AssemblyFormat 属性AssemblyFormat 属性定义或返回用于序列化程序集名称的格式。此属性使用在生成的 SOAP 信息中程序集引用的 FormatterAs
13、semblyStyle 枚举格式。当反序列化一个对象时,这些引用可用于定位程序集。该属性只应用于消息的格式,而不应用于序列化对象的格式,这是由于序列化对象的格式是通过选择BinaryFormatter 或SoapFormatter来控制的。Binder 属性在 SoapFormatter 类中关于此属性的描述与 BinaryFormatte 类中的描述相同。7.1.2 SoapFormatter类的成员类的成员Context 属性Context 属性定义或返回和SoapFormatter 一起使用的 StreamingContext。StreamingContext 包含关于序列化消息的目标的
14、信息,可允许目标对象为其接收的对象确定正确的上下文。例如,你已从 Person 类派生了许多类型,且 Customer 类型即是其中一个。当序列化 Person 类型的一个对象时,你希望该对象能告知目标它是 Customer 类型。Context 属性被传递给处理自己的序列化的对象。FilterLevel 属性FilterLevel 属性定义或返回自动反序列化的 TypeFilterLevel 枚举类型的值,以用于.NET Framework 远程处理。该值取决于 TypeFilterLevel 枚举所指定的值,可为 Low 或 Full。该属性在 SoapFormatter 中支持的 Low
15、 和Full 反序列化级别类型和在 BinaryFormatter 中所支持的相同。SurrogateSelector 属性SurrogateSelector 属性定义或返回 ISurrogateSelector 类,以控制序列化和反序列化过程中的类型替换。该类属于 System.Runtime.Serialization 命名空间。ISurrogateSelector 指定一个替换类型以控制未定义为可序列化的特定类型的序列化过程。序列化代理提供一个对象,以处理另一个对象的序列化要求,并在必要时转换序列化数据。SoapFormatter类的类的成员(续)成员(续)续表续表:7.1.2 Soap
16、Formatter类的成员类的成员TopObject 属性TopObject 属性定义或返回 ISoapMessage,一个在传输字节过程中用于发送和接收的消息类型,其中可反序列化SOAP 顶级对象。TopObject 属性设置 ISoapMessage 以接收具有反序列化 RPC(Remote Procedure Call,远程过程调用)格式的消息中的数据。TypeFormat 属性TypeFormat 属性定义或返回类型说明在序列化流中的布局格式。该属性控制当SOAP 消息中生成对象引用标识符时的格式类型。该属性接收一个FormatterTypeStyle 枚举类型的值,该枚举类型拥有以下
17、成员:TypesAlwaysTypesWhenNeededXsdStringSoapFormatter类的类的成员(续)成员(续)续表续表:续表:续表:7.1.2 SoapFormatter类的成员类的成员DeSerialize 方法DeSerialize 方法将提供流上的数据反序列化,并在接收位置重组对象图。SoapFormatter提供了Deserialize方法的下列两个版本:Deserialize(Stream):该方法存储包含要被反序列化的数据的流,并返回该反序列化图形的顶级对象。Deserialize(Stream,HeaderHandler):该方法将流反序列化为对象图,并由指定
18、的委托来处理流中的任何头,以对在流中找到的任何头对象进行处理。Serialize 方法Serialize 方法将对象或具有指定根的对象图序列化为给定的流。SoapFormatter提供了 Serialize 方法的以下两个版本:Serialize(Stream,Object):此方法将嵌入到 SOAP 消息正文内的对象序列化为指定的流。Serialize(Stream,Object,Header):此方法也将嵌入到 SOAP 消息正文内的对象序列化为指定的流,但是标题数组将指定要包含在SOAP 消息中的标题。该方法为序列化的对象创建包含正文部分和标题部分的消息。SoapFormatter类的类
19、的成员(续)成员(续)生成序列化的二进制格式和生成序列化的二进制格式和 SOAP 格式格式生成序列化的生成序列化的 XML 格式格式创建自定义序列化类创建自定义序列化类 小结小结实验实验习题习题第第7章章 数据的序列化数据的序列化使用使用XmlSerializer 类将对象序列化为类将对象序列化为 XML 格式格式 使用使用 XML 序列化属性控制生成的序列化属性控制生成的 XML 生成序列化的生成序列化的 XML 格式格式7.2生成序列化的生成序列化的 XML 格式格式XML 是一种开放式标准。是一种开放式标准。XML 序列化是一个将对象的公共属序列化是一个将对象的公共属性和字段转换为序列化
20、的性和字段转换为序列化的 XML 格式以达到存储或传输目的的格式以达到存储或传输目的的过程。过程。XML 序列化还可用于将对象序列化为遵循序列化还可用于将对象序列化为遵循 SOAP 规范规范的的 XML 流。流。XmlSerializer 类中最常用的方法类中最常用的方法使用使用 XmlSerializer类将对类将对象序列化为象序列化为XML格式格式 7.2.1 使用使用XmlSerializer 类将类将对象序列化为对象序列化为 XML 格式格式方法描述CanDeserializeCanDeserialize 方法将检查 XmlSerializer 类能否反序列化指定的XML 文档。该方法
21、将接受 XmlReader 作为一个指向反序列化的文档的参数。如果 XmlSerializer 类能反序列化 XmlReader 所指向的对象,则 CanDeserialize 方法将返回true。否则,它将返回false。DeserializeDeserialize 方法将 XML 文档反序列化为其原始状态。该方法通过使用反序列化的对象的类型来构造 XmlSerializer 类。它从 XML 文档读取并构造一个对象,该对象的类型即是构造 XmlSerializer 时所使用的相应类型。当解析 XML 时,数据被转换为该对象的有关成员的数据类型。可以用多种格式指定要反序列化的 XML 文档,
22、例如Stream、TextReader和 XMLReader。因此,Deserialize 方法拥有以下重载形式:XmlSerializer.Deserialize(Stream):该形式对指定流中包含的 XML 文档进行反序列化。该流提供了一系列字节的泛型视图。XmlSerializer.Deserialize(TextReader):该形式对指定的 TextReader 所包含的 XML 文档进行反序列化。TextReader 表示一个可以读取一组连续字符的读取器。XmlSerializer.Deserialize(XmlReader):该形式对指定的 XmlReader 所包含的 XML
23、 文档进行反序列化。XmlReader 表示一个提供快速、非缓存和只进访问 XML 数据的读取器。7.2.1 使用使用XmlSerializer 类将类将对象序列化为对象序列化为 XML 格式格式FromTypesFromTypes 方法将返回从类型数组中创建的 XmlSerializer 对象数组。该方法有助于创建XmlSerializer 对象数组,以处理 Type 对象数组。SerializeSerialize 方法将对象序列化到 XML 文档。该方法拥有多种重载形式。其中的一些重载形式如下:Serialize(Stream,Object):序列化指定的对象并使用指定的流将 XML 文档
24、写入文件。Serialize(TextWriter,Object):序列化指定的对象并使用指定的 TextWriter 将 XML 文档写入文件。Serialize(XmlWriter,Object):序列化指定的对象并使用指定的 XmlWriter 将 XML 文档写入文件。每种重载形式允许使用不同的方法将特定对象序列化为指定的流。一些重载还允许将 XML 命名空间的引用指定到生成的XML 中。代码示例代码示例C使用使用XmlSerializer 类将对象类将对象序列化为序列化为 XML 格式(续)格式(续)续表续表:自定义自定义 XML 格式的属性格式的属性 7.2.2 使用使用 XML
25、序列化属性序列化属性控制生成的控制生成的 XML属性描述XmlAnyAttributeAttributeXmlAnyAttributeAttribute 包含作为 XML 文档的一部分进行发送的任意数据(作为元素的属性)。该属性的用途是建立一个字段或属性,以接收没有映射到类的字段或属性的 XML 属性。XmlAnyAttributeAttribute 可以应用于一个表示 XmlAttribute 或 XmlNode 对象数组的字段。XmlAttribute 表示 XML 元素的某个属性,而XmlNode 表示 XML 文档中的单个节点。如果指定了该属性,则在反序列化之后,不具有该反序列化类的相
26、应成员的所有 XML 属性,将被收集在一个数组中。该数组可循环访问,以在反序列化之后处理这些值。XmlAnyElementAttributeXmlAnyElementAttribute 包含任意以 XML 文档元素的形式进行发送的数据。该属性的用途是建立一个字段或属性,以接收那些未映射到类的字段或属性的 XML 元素。XmlAnyElementAttribute 应用于一个返回 XmlElement 或 XmlNode 对象数组的字段。XmlElement 表示一个XML元素,而 XmlNode 表示 XML 文档中的单个节点。可将 XmlAnyElementAttribute 应用于 Xml
27、Element 类型的字段中。使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XML使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XML(续)(续)7.2.2 使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XMLXmlArrayAttributeXmlArrayAttribute 旨在控制数组的序列化。该属性指示 XmlSerializer 将特定的类成员序列化为XML元素数组。通过应用 XmlArrayAttribute,可以确定生成的 XML 元素的属性,还可以更改 XML 元素的名称。XmlArrayItemAttributeXmlArrayIte
28、mAttribute 旨在控制数组的序列化。它允许派生类的序列化,并指定可以被 XmlSerializer 放入序列化的数组的派生类型。可以使用 XmlArrayItemAttribute 的多个实例,每个实例之间以逗号分隔,以指定插入该数组的不同对象类型。此方法可以指示 XmlSerializer 将多个对象类型的对象插入同一序列化的数组中。此时,需要确保每种指定类型与该数组的类型相同,或与使用XmlArrayItemAttribute 的集合的类型相同,或与从该集合派生的类型相同。续表续表:7.2.2 使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XMLXmlAttribut
29、eAttributeXmlAttributeAttribute 指定 XmlSerializer 将类成员序列化为 XML 属性。可将 XmlAttributeAttribute 只赋给那些返回值或值数组(可映射为一种 XSD 类型)的公共字段或公共属性。XmlChoiceIdentifierAttributeXmlChoiceIdentifierAttribute 指定通过使用枚举可以进一步检测成员。这可允许建立一个序列化为一组选择(例如列表)的对象。XMLChoiceIdentifier 允许指定选择在该列表中所选择的项。XmlChoiceIdentifierAttribute 允许将某个
30、特定枚举值赋给每个成员实例。用户可自行创建枚举,也可通过使用 XML 架构定义工具(Xsd.exe)来生成枚举。使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XML(续)(续)续表续表:7.2.2 使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XMLXmlElementAttribute当 XmlSerializer 序列化或反序列化包含某个 XML 元素的对象时,XmlElementAttribute 指定一个表示该 XML 元素的公共字段或属性。可将 XmlElementAttribute 应用于公共字段或公共读/写属性,以控制 XML 元素(例如元素名称或命名
31、空间)的特性。XmlEnumAttributeXmlEnumAttribute 控制 XmlSerializer 类序列化枚举成员的过程。可使用 XmlEnumAttribute 分别更改序列化期间 XmlSerializer 生成枚举成员的方法或反序列化期间 XmlSerializer 识别枚举成员的方法。例如,假设有一个枚举,它表示一组数,其中包含名为 One 的首成员。在序列化成员 One 后,你希望 XML 中的输出为 Uno,而非One。这可通过以下方式来实现:将XmlEnumAttribute 应用于该枚举成员,然后将Name 属性设置为Uno。XmlIgnoreAttribute
32、XmlIgnoreAttribute 指示 XmlSerializer 类的 Serialize 方法不要序列化公共字段或公共读/写属性值。如果将 XmlIgnoreAttribute 应用于任何类成员,则当序列化或反序列化类的实例时XmlSerializer 类将忽略该成员。使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XML(续)(续)续表续表:7.2.2 使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XMLXmlIncludeAttribute当 XmlSerializer 类序列化或反序列化对象时,XmlIncludeAttribute 允许该类识别特定类型
33、。该类型可以是为序列化而定义的任何派生类。当应用 XmlIncludeAttribute 时,需要指定该派生类的类型。在序列化包含基类和派生类的对象的过程中,XmlSerializer 类可以识别这两种对象类型。XmlRootAttributeXmlRootAttribute 控制作为 XML 根元素的属性对象的XML 序列化。XmlRootAttribute 可应用于类、结构、枚举或接口。每个 XML 文档都拥有一个根元素,它包含所有其他元素。XmlRootAttribute 允许通过设置 XmlSerializer 类的属性以控制根元素的生成。这有助于更好地控制文档的输出以及其所包含的XM
34、L。使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XML(续)(续)续表续表:7.2.2 使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XMLXmlTextAttribute在对象的序列化或反序列化过程中,XmlTextAttribute 指示 XmlSerializer 应将指定成员作为XML 文本处理。XmlSerializer 将该成员的值转换为 XML 文本,并将该值编码为XML元素的内容。在一个类中只可申请一个XmlTextAttribute 的实例。该属性允许一个基于该相应类的字符串输出。由于这个原因,需要对每个类的 XmlTextAtttribute的
35、实例做出限制。XmlTypeAttributeXmlTypeAttribute 控制当通过 XmlSerializer 类序列化属性对象时,所生成的XML 架构。XmlTypeAttribute 可应用于类、结构、枚举或接口声明。XmlTypeAttribute 指定 XML 类型的名称和命名空间。可以将该属性与 XSD.exe 工具一起使用以生成一个 XSD 文件。使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XML(续)(续)续表续表:SOAP 格式的属性:格式的属性:7.2.2 使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XML属性描述SoapAttribu
36、teAttributeSoapAttributeAttribute 属性规定,XmlSerializer 类应将类成员序列化为已编码的 SOAP 属性。SoapAttributeAttribute 应用于公共字段,以指定 XmlSerializer 类将该字段序列化为 XML 属性。对能够接受适当输入的 SOAP 对象而言,这是很有用的。另外,这也允许使用一个属性来序列化 Customer 对象,例如使用 Preferred 属性将 SoapAttribute 设置为Preferred 并序列化该对象。SoapElementAttributeSoapElementAttribute 规定公共成
37、员值可由 XmlSerializer 类序列化为已编码的 SOAP XML 元素。SoapElementAttribute 应用于公共字段,以指示 XmlSerializer 将该字段序列化为已编码的 SOAP XML 元素。SoapEnumAttributeSoapEnumAttribute 控制 XmlSerializer序列化枚举成员的过程。可以使用 SoapEnumAttribute 来更改在序列化期间 XmlSerializer 生成枚举成员的方法或在反序列化期间 XmlSerializer 识别枚举成员的方法。例如,假设有一个枚举,它表示一组数,其中包含名为 State 的首成员。
38、当序列化该成员时,需要让 XML 中的输出为 Region,而非 State。通过将SoapEnumAttribute 应用于该枚举成员,然后将 Name 属性设置为 Region,可以实现这一点。使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XML(续)(续)7.2.2 使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XMLSoapIgnoreAttributeSoapIgnoreAttribute 可应用于任何在序列化类的实例时希望 XmlSerializer 忽略的类成员。SoapIgnoreAttribute 指示 XmlSerializer 类不要序列化公共
39、字段或公共读/写属性值。SoapIncludeAttributeSoapIncludeAttribute 允许在 XmlSerializer将对象序列化或反序列化为已编码的 SOAP XML时识别指定类型。当应用 SoapIncludeAttribute 时,指定派生类的 Type。在序列化包括基类和派生类的对象的过程中,XmlSerializer 可以识别这两种对象类型。SoapTypeAttribute当类实例序列化为SOAP 格式的 XML时,SoapTypeAttribute 控制 XmlSerializer 生成的架构。SoapTypeAttribute 只能应用于类的声明。这允许该
40、属性控制所有类成员的 SoapType,以实现一致性。使用此SoapTypeAttribute 集合,所有成员(例如 Customer 类的First Name、Last Name以及Phone Number)将拥有与 Customer 类相同的 SoapTypeAttribute。代码示例代码示例VB使用使用 XML 序列化属性序列化属性控制生成的控制生成的 XML(续)(续)续表续表:生成序列化的二进制格式和生成序列化的二进制格式和 SOAP 格式格式生成序列化的生成序列化的 XML 格式格式创建自定义序列化类创建自定义序列化类 小结小结实验实验习题习题第第7章章 数据的序列化数据的序列化
41、使用序列化类型收集序列化信息使用序列化类型收集序列化信息 使用序列化接口创建自定义类使用序列化接口创建自定义类 使用格式化程序类将数据转换为序列化格式使用格式化程序类将数据转换为序列化格式 使用事件处理程序属性处理序列化事件使用事件处理程序属性处理序列化事件 使用使用ObjectManager 类管理反序列化的对象类管理反序列化的对象 创建自定义序列化类创建自定义序列化类 7.3创建自定义序列化类创建自定义序列化类SerializationEntry 结构结构 SerializationInfo类类 使用序列化类型使用序列化类型收集序列化信息收集序列化信息 7.3.1 使用序列化类型收集序列化
42、信息使用序列化类型收集序列化信息当使用对象时,需要以某种格式实现序列化,从而将信息保存到当使用对象时,需要以某种格式实现序列化,从而将信息保存到该对象或将该对象转移到另一个进程中。该对象或将该对象转移到另一个进程中。StreamingContext 结构结构 SerializationEntry 结构结构 1.SerializationEntry 结构结构SerializationEntry 结构包含结构包含Name、ObjectType以及以及Value 属性,分属性,分别用来检索序列化的对象的名称、类型以及值。因此,当序列别用来检索序列化的对象的名称、类型以及值。因此,当序列化对象时,通过
43、使用该结构可以传递反序列化所必需的信息。化对象时,通过使用该结构可以传递反序列化所必需的信息。成员描述NameName 属性获取对象的名称。ObjectTypeObjectType 属性获取对象的 Type。如果序列化的对象为一个空引用,则该属性将返回 Object 类型。ValueValue 属性获取序列化的对象中包含的值。代码示例代码示例C代码示例代码示例VBSerializationInfo 类的成员类的成员 SerializationInfo类类 2.SerializationInfo类类成员描述AssemblyNameAssemblyName 属性获取或设置序列化期间要序列化的类型的
44、程序集名称。该程序集名称包含程序集名称、版本、文化以及关于该对象的安全性信息。文化表示特定文化的信息,例如该文化的名称、语言和区域。安全性信息可以是用户上下文、代码上下文或代理设置。FullTypeNameFullTypeName 属性获取或设置要序列化的Type 全名。FullTypeName 是该类型的完全限定名称,包含相应的命名空间。当序列化此对象的类型信息时,格式化程序会使用此名称。MemberCountMemberCount属性获取添加到 SerializationInfo 类存储的成员的数目。续表续表 2.SerializationInfo类类GetValueGetValue 方法
45、从基于指定的名称和类型的 SerializationInfo 类中检索一个值。当存储在 SerializationInfo 类中的数据与请求的类型匹配时,该方法将返回与该名称直接关联的值。例如,如果存储与名称 Age 相关联的值42,则当检索 Age 时,将获取值42 作为答案。如果返回值与请求的类型不相符,则调用IFormatterConverter.Convert 以将其转换为适当的类型。IFormatterConverter 接口在 SerializationInfo 的实例与最适合解析 SerializationInfo 类中的数据的格式化程序提供的类之间提供了一个连接。IFormat
46、terConverter 接口属于 System.Runtime.Serialization 命名空间。AddValueAddValue 方法将有助于向SerializationInfo 类中添加一个值。AddValue 方法拥有多个重载形式,例如SerializationInfo.AddValue(String,DateTime)、SerializationInfo.AddValue(String,Int32)及SerializationInfo.AddValue(String,Boolean)。在所有这些重载形式中,AddValue 方法接受了一个“名称/值”对,其中值表示要添加的实际值,
47、而名称表示要与相应值关联的名称。反序列化对象时,可以使用该名称从 SerializationInfo 存取区中检索相关联的值。GetTypeGetType 方法获取当前SerializationInfo 实例的Type。这是一个从泛型 Object 类型继承来的方法(可以为所有对象定义此方法)。如果不能加载该类型,则这个方法将返回一个空引用。仅当在内存中找不到该类型和类型不能加载到内存中时才会发生空引用。SetTypeSetType 方法设置要序列化的对象的 Type。使用 SetType 方法与设置 FullTypeName 和 AssemblyName 是等效的。代码示例代码示例C 代码示
48、例代码示例VB续表续表:StreamingContext 结构结构 3.StreamingContext 结构结构成员描述StateState 属性获取传输数据的源或目标。它是一个只读属性。在序列化期间,该属性指定传输数据的目标。在反序列化期间,该属性指出反序列化流的源。State 属性接受枚举值,StreamingContextStates,该值提供关于所发生的序列化类型的信息。StreamingContextStates 枚举拥有下列成员:All:该成员指定可向任何上下文传输或从任何上下文接收序列化的数据。Clone:该成员指定正在克隆对象图而不影响原始对象。在这种情形下,可以假定克隆图将
49、继续与原始对象图在同一进程中存在。CrossAppDomain:该成员指定序列化数据的源或目标上下文是另一个应用程序域。CrossMachine:该成员指定序列化数据的源或目标上下文是另一台计算机。CrossProcess:该成员指定序列化数据的源或目标上下文是同一计算机上的另一个进程。File:该成员指定序列化数据的源或目标是一个文件。Other:该成员指定序列化上下文未知,这意味着其上下文状态不是其他可能的上下文状态(例如File、Remoting或CrossMachine)中的任何一个。可以使用该成员覆盖开发期间可能引发的意外情况。Persistence:该成员指定序列化数据的源或目标上
50、下文是永久的存储区,例如数据库、文件或其他后备存储区。Remoting:该成员指定序列化的数据用于一个远程上下文中,该远程上下文可为未知位置中的另一台计算机。CrossAppDomain、CrossMachine、CrossProcess和 File 成员将覆盖一个在分布式环境(可以跨应用程序域、进程、文件或计算机)中共享数据的应用程序。这将在分布式环境中启用应用程序缩放功能。ContextContext 属性获取指定作为调用方定义的附加上下文一部分的上下文。使用该属性,可以将任何用户定义的值传递给StreamingContext 结构。该属性是一个只读属性并可以返回一个空引用。代码示例代码示