使用ObjectManager类管理反序列化的对象课件_第1页
使用ObjectManager类管理反序列化的对象课件_第2页
使用ObjectManager类管理反序列化的对象课件_第3页
使用ObjectManager类管理反序列化的对象课件_第4页
使用ObjectManager类管理反序列化的对象课件_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章 数据的序列化第7章 数据的序列化.NETFramework2.0程序设计第1章:.NETFramework2.0简介

第2章:公共语言运行库和类型第3章:托管代码的编译和执行第4章:委托和事件第5章:读取和写入文件第6章:集合和泛型第7章:数据的序列化

第8章:GDI+第9章:在.NETFramework2.0中实现加密第10章:COM组件与.NETFramework程序集之间的交互操作第11章:使用类型元数据第12章:创建多线程应用程序和应用程序域第13章:代码访问安全性第14章:监视和调试应用程序第15章:使用服务应用程序和电子邮件消息第16章:创建全球化应用程序第17章:配置和安装程序集.NETFramework2.0程序设计第1章:本章学习目标:通过BinaryFormatter类和SoapFormatter类,将对象序列化为二进制格式和SOAP格式

通过XmlSerializer类、IXmlSerializable接口及XML序列化属性和委托,将对象序列化为自定义XML格式创建自定义序列化类

目标本章学习目标:目标生成序列化的二进制格式和SOAP格式生成序列化的XML格式创建自定义序列化类

小结实验习题第7章数据的序列化生成序列化的二进制格式和SOAP格式第7章数据的序生成序列化的二进制

格式和SOAP格式7.1 生成序列化的二进制格式和SOAP格式对象数据的传输序列化和反序列化代码示例VB生成序列化的二进制

格式和SOAP格式7.1 生成序列.BinaryFormatter类的成员BinaryFormatter类的成员7.1.1 BinaryFormatter类的成员成员描述AssemblyFormat属性AssemblyFormat属性定义或返回用于序列化程序集名称的程序集格式。该返回值取决于FormatterAssemblyStyle枚举(拥有两个成员:Full和Simple)的值。在程序集格式为Full的情况下,程序集描述包括程序集名称、所保存的对象的全球文化以及程序集的版本和公钥标志。在程序集格式为Simple的情况下,程序集描述仅由程序集名称组成。Binder属性Binder属性定义或返回一个SerializationBinder类的对象,该对象用于控制将序列化对象绑定到类型的过程。这里,类型是指在序列化过程中用于加载序列化对象的自定义类型,而非该序列化对象的实际类型。在对象被反序列化时,这将有助于你选择所要的对象类型。例如,雇员信息原来以Employee类型进行保存,稍后,由于雇员要从公司商店购买一些产品,所以要序列化该雇员信息。因此,你需要将该雇员信息以Customer类型进行反序列化。通过SerializationBinder类可加载自定义类型,以替代由序列化引擎执行的默认加载,这意味着可以更改序列化对象的默认行为。另外,还可以通过使用SerializationBinder来检查应用程序域中加载的类型。这将有助于维护包含拒绝类型的黑名单和允许类型的白名单,并限制被加载和实例化的类型。.BinaryFormatter类的成员BinaryFor.BinaryFormatter类的成员(续)7.1.1 BinaryFormatter类的成员Context属性Context属性定义或返回BinaryFormatter的StreamingContext。StreamingContext结构指示格式化程序所使用的位的源或目标。FilterLevel属性FilterLevel属性定义或返回BinaryFormatter所执行的自动反序列化的TypeFilterLevel枚举类型的值。该值取决于TypeFilterLevel枚举所指定的值,可为Low或Full。Low反序列化级别是.NETFramework中的默认值。它仅对与最基本的远程处理功能相关联的类型进行反序列化,从而抵御反序列化攻击。反序列化攻击允许未授权用户拦截消息,并读取或更改该消息中的信息。Low反序列化级别支持的类型有:远程处理基础结构对象、基元类型、引用类型以及值类型。Full反序列化级别支持对所有这些类型的自动反序列化,即在任何情况下受远程处理支持的类型。续表:.BinaryFormatter类的7.1.1 Binary.SurrogateSelector属性SurrogateSelector属性定义或返回ISurrogateSelector接口,以控制序列化和反序列化过程中的类型替换。ISurrogateSelector接口属于System.Runtime.Serialization命名空间。使用SurrogateSelector属性,未标记为可序列化的对象也可被序列化。假设一个示例,其中你创建一个Customer类型的对象,但是不能将其标记为Serializable。因此,你创建一个ISurrogateSelector接口的类型,并将SurrogateSelector属性设置为该类型的对象,以将Customer类型指向到已标记为可序列化的Person类型。这允许序列化对象的Customer类型。TypeFormat属性TypeFormat属性定义或返回类型说明在序列化流中的布局格式。该属性接收一个FormatterTypeStyle枚举类型的值,该枚举类型拥有以下成员:TypesAlways:指示可为所有对象和ISerializable对象成员提供类型。TypesWhenNeeded:指示只能为对象数组、Object类型的对象成员以及ISerializable非基元值类型(例如结构和枚举)声明类型。XsdString:指示可以XSD格式(而非SOAP格式)提供字符串。7.1.1 BinaryFormatter类的成员续表续表:.SurrogateSelector属性Surrogate.DeSerialize方法DeSerialize方法将指定的流反序列化为对象图。如果反序列化成功,则该流中的当前位置必须位于对象图的开头。该方法将返回该对象图的顶级对象。Deserialize方法拥有两种重载形式:BinaryFormatter.Deserialize(Stream):此形式将指定的流反序列化为对象图。BinaryFormatter.Deserialize(Stream,HeaderHandler):此形式也将指定的流反序列化为对象图。另外,此形式中提供的HeaderHandler参数将处理该流中的所有标题对象。标题对象传达关于远程函数调用的信息。标题对象的一些例子包括事务ID或方法签名。如果创建HeaderHandler,则需要确定要处理该事件的方法。Serialize方法Serialize方法将对象或具有指定头的对象图序列化为给定的流。Serialize方法拥有以下两种重载形式:BinaryFormatter.Serialize(Stream,Object):此形式将对象或具有指定头的对象图序列化为给定的流。BinaryFormatter.Serialize(Stream,Object,Header[]):此形式通过附加所提供的标题,也将对象或具有指定头的对象图序列化为给定的流。所包括的标题将有助于传输关于消息如何处理的信息。序列化进程包含序列化流的开始处的标题参数所提供的信息。7.1.1 BinaryFormatter类的成员续表续表:.DeSerialize方法DeSerialize方法将.SoapFormatter类的成员SoapFormatter类的成员7.1.2 SoapFormatter类的成员成员描述AssemblyFormat属性AssemblyFormat属性定义或返回用于序列化程序集名称的格式。此属性使用在生成的SOAP信息中程序集引用的FormatterAssemblyStyle枚举格式。当反序列化一个对象时,这些引用可用于定位程序集。该属性只应用于消息的格式,而不应用于序列化对象的格式,这是由于序列化对象的格式是通过选择BinaryFormatter或SoapFormatter来控制的。Binder属性在SoapFormatter类中关于此属性的描述与BinaryFormatte类中的描述相同。.SoapFormatter类的成员SoapFormatt.7.1.2 SoapFormatter类的成员Context属性Context属性定义或返回和SoapFormatter一起使用的StreamingContext。StreamingContext包含关于序列化消息的目标的信息,可允许目标对象为其接收的对象确定正确的上下文。例如,你已从Person类派生了许多类型,且Customer类型即是其中一个。当序列化Person类型的一个对象时,你希望该对象能告知目标它是Customer类型。Context属性被传递给处理自己的序列化的对象。FilterLevel属性FilterLevel属性定义或返回自动反序列化的TypeFilterLevel枚举类型的值,以用于.NETFramework远程处理。该值取决于TypeFilterLevel枚举所指定的值,可为Low或Full。该属性在SoapFormatter中支持的Low和Full反序列化级别类型和在BinaryFormatter中所支持的相同。SurrogateSelector属性SurrogateSelector属性定义或返回ISurrogateSelector类,以控制序列化和反序列化过程中的类型替换。该类属于System.Runtime.Serialization命名空间。ISurrogateSelector指定一个替换类型以控制未定义为可序列化的特定类型的序列化过程。序列化代理提供一个对象,以处理另一个对象的序列化要求,并在必要时转换序列化数据。SoapFormatter类的成员(续)续表:.7.1.2 SoapFormatter类的成员Contex.7.1.2 SoapFormatter类的成员TopObject属性TopObject属性定义或返回ISoapMessage,一个在传输字节过程中用于发送和接收的消息类型,其中可反序列化SOAP顶级对象。TopObject属性设置ISoapMessage以接收具有反序列化RPC(RemoteProcedureCall,远程过程调用)格式的消息中的数据。TypeFormat属性TypeFormat属性定义或返回类型说明在序列化流中的布局格式。该属性控制当SOAP消息中生成对象引用标识符时的格式类型。该属性接收一个FormatterTypeStyle枚举类型的值,该枚举类型拥有以下成员:TypesAlwaysTypesWhenNeededXsdStringSoapFormatter类的成员(续)续表:.7.1.2 SoapFormatter类的成员TopObj.续表:7.1.2 SoapFormatter类的成员DeSerialize方法DeSerialize方法将提供流上的数据反序列化,并在接收位置重组对象图。SoapFormatter提供了Deserialize方法的下列两个版本:Deserialize(Stream):该方法存储包含要被反序列化的数据的流,并返回该反序列化图形的顶级对象。Deserialize(Stream,HeaderHandler):该方法将流反序列化为对象图,并由指定的委托来处理流中的任何头,以对在流中找到的任何头对象进行处理。

Serialize方法Serialize方法将对象或具有指定根的对象图序列化为给定的流。SoapFormatter提供了Serialize方法的以下两个版本:Serialize(Stream,Object):此方法将嵌入到SOAP消息正文内的对象序列化为指定的流。Serialize(Stream,Object,Header[]):此方法也将嵌入到SOAP消息正文内的对象序列化为指定的流,但是标题数组将指定要包含在SOAP消息中的标题。该方法为序列化的对象创建包含正文部分和标题部分的消息。SoapFormatter类的成员(续).续表:7.1.2 SoapFormatter类的成员DeS生成序列化的二进制格式和SOAP格式生成序列化的XML格式创建自定义序列化类

小结实验习题第7章数据的序列化生成序列化的二进制格式和SOAP格式第7章数据的序使用XmlSerializer类将对象序列化为XML格式

使用XML序列化属性控制生成的XML

.生成序列化的XML格式7.2 生成序列化的XML格式XML是一种开放式标准。XML序列化是一个将对象的公共属性和字段转换为序列化的XML格式以达到存储或传输目的的过程。XML序列化还可用于将对象序列化为遵循SOAP规范的XML流。使用XmlSerializer类将对象序列化为XML格XmlSerializer类中最常用的方法使用XmlSerializer类将对象序列化为XML格式7.2.1 使用XmlSerializer类将对象序列化为XML格式方法描述CanDeserializeCanDeserialize方法将检查XmlSerializer类能否反序列化指定的XML文档。该方法将接受XmlReader作为一个指向反序列化的文档的参数。如果XmlSerializer类能反序列化XmlReader所指向的对象,则CanDeserialize方法将返回true。否则,它将返回false。DeserializeDeserialize方法将XML文档反序列化为其原始状态。该方法通过使用反序列化的对象的类型来构造XmlSerializer类。它从XML文档读取并构造一个对象,该对象的类型即是构造XmlSerializer时所使用的相应类型。当解析XML时,数据被转换为该对象的有关成员的数据类型。可以用多种格式指定要反序列化的XML文档,例如Stream、TextReader和XMLReader。因此,Deserialize方法拥有以下重载形式:XmlSerializer.Deserialize(Stream):该形式对指定流中包含的XML文档进行反序列化。该流提供了一系列字节的泛型视图。XmlSerializer.Deserialize(TextReader):该形式对指定的TextReader所包含的XML文档进行反序列化。TextReader表示一个可以读取一组连续字符的读取器。XmlSerializer.Deserialize(XmlReader):该形式对指定的XmlReader所包含的XML文档进行反序列化。XmlReader表示一个提供快速、非缓存和只进访问XML数据的读取器。XmlSerializer类中最常用的方法使用XmlS7.2.1 使用XmlSerializer类将对象序列化为XML格式FromTypesFromTypes方法将返回从类型数组中创建的XmlSerializer对象数组。该方法有助于创建XmlSerializer对象数组,以处理Type对象数组。SerializeSerialize方法将对象序列化到XML文档。该方法拥有多种重载形式。其中的一些重载形式如下:Serialize(Stream,Object):序列化指定的对象并使用指定的流将XML文档写入文件。Serialize(TextWriter,Object):序列化指定的对象并使用指定的TextWriter将XML文档写入文件。Serialize(XmlWriter,Object):序列化指定的对象并使用指定的XmlWriter将XML文档写入文件。每种重载形式允许使用不同的方法将特定对象序列化为指定的流。一些重载还允许将XML命名空间的引用指定到生成的XML中。代码示例C#使用XmlSerializer类将对象序列化为XML格式(续)续表:7.2.1 使用XmlSerializer类将FromTy自定义XML格式的属性7.2.2 使用XML序列化属性控制生成的XML属性描述XmlAnyAttributeAttributeXmlAnyAttributeAttribute包含作为XML文档的一部分进行发送的任意数据(作为元素的属性)。该属性的用途是建立一个字段或属性,以接收没有映射到类的字段或属性的XML属性。XmlAnyAttributeAttribute可以应用于一个表示XmlAttribute或XmlNode对象数组的字段。XmlAttribute表示XML元素的某个属性,而XmlNode表示XML文档中的单个节点。如果指定了该属性,则在反序列化之后,不具有该反序列化类的相应成员的所有XML属性,将被收集在一个数组中。该数组可循环访问,以在反序列化之后处理这些值。XmlAnyElementAttributeXmlAnyElementAttribute包含任意以XML文档元素的形式进行发送的数据。该属性的用途是建立一个字段或属性,以接收那些未映射到类的字段或属性的XML元素。XmlAnyElementAttribute应用于一个返回XmlElement或XmlNode对象数组的字段。XmlElement表示一个XML元素,而XmlNode表示XML文档中的单个节点。可将XmlAnyElementAttribute应用于XmlElement类型的字段中。使用XML序列化属性

控制生成的XML自定义XML格式的属性7.2.2 使用XML序列化使用XML序列化属性

控制生成的XML(续)7.2.2 使用XML序列化属性控制生成的XMLXmlArrayAttributeXmlArrayAttribute旨在控制数组的序列化。该属性指示XmlSerializer将特定的类成员序列化为XML元素数组。通过应用XmlArrayAttribute,可以确定生成的XML元素的属性,还可以更改XML元素的名称。XmlArrayItemAttributeXmlArrayItemAttribute旨在控制数组的序列化。它允许派生类的序列化,并指定可以被XmlSerializer放入序列化的数组的派生类型。可以使用XmlArrayItemAttribute的多个实例,每个实例之间以逗号分隔,以指定插入该数组的不同对象类型。此方法可以指示XmlSerializer将多个对象类型的对象插入同一序列化的数组中。此时,需要确保每种指定类型与该数组的类型相同,或与使用XmlArrayItemAttribute的集合的类型相同,或与从该集合派生的类型相同。续表:使用XML序列化属性

控制生成的XML(续).2 使用XML序列化属性控制生成的XMLXmlAttributeAttributeXmlAttributeAttribute指定XmlSerializer将类成员序列化为XML属性。可将XmlAttributeAttribute只赋给那些返回值或值数组(可映射为一种XSD类型)的公共字段或公共属性。XmlChoiceIdentifierAttributeXmlChoiceIdentifierAttribute指定通过使用枚举可以进一步检测成员。这可允许建立一个序列化为一组选择(例如列表)的对象。XMLChoiceIdentifier允许指定选择在该列表中所选择的项。XmlChoiceIdentifierAttribute允许将某个特定枚举值赋给每个成员实例。用户可自行创建枚举,也可通过使用XML架构定义工具(Xsd.exe)来生成枚举。使用XML序列化属性

控制生成的XML(续)续表:7.2.2 使用XML序列化属性XmlAttribute7.2.2 使用XML序列化属性控制生成的XMLXmlElementAttribute当XmlSerializer序列化或反序列化包含某个XML元素的对象时,XmlElementAttribute指定一个表示该XML元素的公共字段或属性。可将XmlElementAttribute应用于公共字段或公共读/写属性,以控制XML元素(例如元素名称或命名空间)的特性。XmlEnumAttributeXmlEnumAttribute控制XmlSerializer类序列化枚举成员的过程。可使用XmlEnumAttribute分别更改序列化期间XmlSerializer生成枚举成员的方法或反序列化期间XmlSerializer识别枚举成员的方法。例如,假设有一个枚举,它表示一组数,其中包含名为One的首成员。在序列化成员One后,你希望XML中的输出为Uno,而非One。这可通过以下方式来实现:将XmlEnumAttribute应用于该枚举成员,然后将Name属性设置为Uno。XmlIgnoreAttributeXmlIgnoreAttribute指示XmlSerializer类的Serialize方法不要序列化公共字段或公共读/写属性值。如果将XmlIgnoreAttribute应用于任何类成员,则当序列化或反序列化类的实例时XmlSerializer类将忽略该成员。使用XML序列化属性

控制生成的XML(续)续表:7.2.2 使用XML序列化属性XmlElementAt7.2.2 使用XML序列化属性控制生成的XMLXmlIncludeAttribute当XmlSerializer类序列化或反序列化对象时,XmlIncludeAttribute允许该类识别特定类型。该类型可以是为序列化而定义的任何派生类。当应用XmlIncludeAttribute时,需要指定该派生类的类型。在序列化包含基类和派生类的对象的过程中,XmlSerializer类可以识别这两种对象类型。XmlRootAttributeXmlRootAttribute控制作为XML根元素的属性对象的XML序列化。XmlRootAttribute可应用于类、结构、枚举或接口。每个XML文档都拥有一个根元素,它包含所有其他元素。XmlRootAttribute允许通过设置XmlSerializer类的属性以控制根元素的生成。这有助于更好地控制文档的输出以及其所包含的XML。使用XML序列化属性

控制生成的XML(续)续表:7.2.2 使用XML序列化属性XmlIncludeAt7.2.2 使用XML序列化属性控制生成的XMLXmlTextAttribute在对象的序列化或反序列化过程中,XmlTextAttribute指示XmlSerializer应将指定成员作为XML文本处理。XmlSerializer将该成员的值转换为XML文本,并将该值编码为XML元素的内容。在一个类中只可申请一个XmlTextAttribute的实例。该属性允许一个基于该相应类的字符串输出。由于这个原因,需要对每个类的XmlTextAtttribute的实例做出限制。XmlTypeAttributeXmlTypeAttribute控制当通过XmlSerializer类序列化属性对象时,所生成的XML架构。XmlTypeAttribute可应用于类、结构、枚举或接口声明。XmlTypeAttribute指定XML类型的名称和命名空间。可以将该属性与XSD.exe工具一起使用以生成一个XSD文件。使用XML序列化属性

控制生成的XML(续)续表:7.2.2 使用XML序列化属性XmlTextAttriSOAP格式的属性:7.2.2 使用XML序列化属性控制生成的XML属性描述SoapAttributeAttributeSoapAttributeAttribute属性规定,XmlSerializer类应将类成员序列化为已编码的SOAP属性。SoapAttributeAttribute应用于公共字段,以指定XmlSerializer类将该字段序列化为XML属性。对能够接受适当输入的SOAP对象而言,这是很有用的。另外,这也允许使用一个属性来序列化Customer对象,例如使用Preferred属性将SoapAttribute设置为Preferred并序列化该对象。SoapElementAttributeSoapElementAttribute规定公共成员值可由XmlSerializer类序列化为已编码的SOAPXML元素。SoapElementAttribute应用于公共字段,以指示XmlSerializer将该字段序列化为已编码的SOAPXML元素。SoapEnumAttributeSoapEnumAttribute控制XmlSerializer序列化枚举成员的过程。可以使用SoapEnumAttribute来更改在序列化期间XmlSerializer生成枚举成员的方法或在反序列化期间XmlSerializer识别枚举成员的方法。例如,假设有一个枚举,它表示一组数,其中包含名为State的首成员。当序列化该成员时,需要让XML中的输出为Region,而非State。通过将SoapEnumAttribute应用于该枚举成员,然后将Name属性设置为Region,可以实现这一点。使用XML序列化属性

控制生成的XML(续)SOAP格式的属性:7.2.2 使用XML序列化属性7.2.2 使用XML序列化属性控制生成的XMLSoapIgnoreAttributeSoapIgnoreAttribute可应用于任何在序列化类的实例时希望XmlSerializer忽略的类成员。SoapIgnoreAttribute指示XmlSerializer类不要序列化公共字段或公共读/写属性值。SoapIncludeAttributeSoapIncludeAttribute允许在XmlSerializer将对象序列化或反序列化为已编码的SOAPXML时识别指定类型。当应用SoapIncludeAttribute时,指定派生类的Type。在序列化包括基类和派生类的对象的过程中,XmlSerializer可以识别这两种对象类型。SoapTypeAttribute当类实例序列化为SOAP格式的XML时,SoapTypeAttribute控制XmlSerializer生成的架构。SoapTypeAttribute只能应用于类的声明。这允许该属性控制所有类成员的SoapType,以实现一致性。使用此SoapTypeAttribute集合,所有成员(例如Customer类的FirstName、LastName以及PhoneNumber)将拥有与Customer类相同的SoapTypeAttribute。代码示例VB使用XML序列化属性

控制生成的XML(续)续表:7.2.2 使用XML序列化属性SoapIgnoreAt生成序列化的二进制格式和SOAP格式生成序列化的XML格式创建自定义序列化类

小结实验习题第7章数据的序列化生成序列化的二进制格式和SOAP格式第7章数据的序使用序列化类型收集序列化信息使用序列化接口创建自定义类使用格式化程序类将数据转换为序列化格式使用事件处理程序属性处理序列化事件使用ObjectManager类管理反序列化的对象.创建自定义序列化类7.3 创建自定义序列化类使用序列化类型收集序列化信息.创建自定义序列化类7.3 SerializationEntry结构SerializationInfo类使用序列化类型

收集序列化信息7.3.1 使用序列化类型收集序列化信息当使用对象时,需要以某种格式实现序列化,从而将信息保存到该对象或将该对象转移到另一个进程中。StreamingContext结构SerializationEntry结构SerializSerializationEntry结构1. SerializationEntry结构SerializationEntry结构包含Name、ObjectType以及Value属性,分别用来检索序列化的对象的名称、类型以及值。因此,当序列化对象时,通过使用该结构可以传递反序列化所必需的信息。成员描述NameName属性获取对象的名称。ObjectTypeObjectType属性获取对象的Type。如果序列化的对象为一个空引用,则该属性将返回Object类型。ValueValue属性获取序列化的对象中包含的值。代码示例C#代码示例VBSerializationEntry结构1. SeriaSerializationInfo类的成员SerializationInfo类2. SerializationInfo类成员描述AssemblyNameAssemblyName属性获取或设置序列化期间要序列化的类型的程序集名称。该程序集名称包含程序集名称、版本、文化以及关于该对象的安全性信息。文化表示特定文化的信息,例如该文化的名称、语言和区域。安全性信息可以是用户上下文、代码上下文或代理设置。FullTypeNameFullTypeName属性获取或设置要序列化的Type全名。FullTypeName是该类型的完全限定名称,包含相应的命名空间。当序列化此对象的类型信息时,格式化程序会使用此名称。MemberCountMemberCount属性获取添加到SerializationInfo类存储的成员的数目。SerializationInfo类的成员Seriali续表2. SerializationInfo类GetValueGetValue方法从基于指定的名称和类型的SerializationInfo类中检索一个值。当存储在SerializationInfo类中的数据与请求的类型匹配时,该方法将返回与该名称直接关联的值。例如,如果存储与名称Age相关联的值42,则当检索Age时,将获取值42作为答案。如果返回值与请求的类型不相符,则调用IFormatterConverter.Convert以将其转换为适当的类型。IFormatterConverter接口在SerializationInfo的实例与最适合解析SerializationInfo类中的数据的格式化程序提供的类之间提供了一个连接。IFormatterConverter接口属于System.Runtime.Serialization命名空间。AddValueAddValue方法将有助于向SerializationInfo类中添加一个值。AddValue方法拥有多个重载形式,例如SerializationInfo.AddValue(String,DateTime)、SerializationInfo.AddValue(String,Int32)及SerializationInfo.AddValue(String,Boolean)。在所有这些重载形式中,AddValue方法接受了一个“名称/值”对,其中值表示要添加的实际值,而名称表示要与相应值关联的名称。反序列化对象时,可以使用该名称从SerializationInfo存取区中检索相关联的值。GetTypeGetType方法获取当前SerializationInfo实例的Type。这是一个从泛型Object类型继承来的方法(可以为所有对象定义此方法)。如果不能加载该类型,则这个方法将返回一个空引用。仅当在内存中找不到该类型和类型不能加载到内存中时才会发生空引用。SetTypeSetType方法设置要序列化的对象的Type。使用SetType方法与设置FullTypeName和AssemblyName是等效的。代码示例C#代码示例VB续表:续表2. SerializationInfo类GetValStreamingContext结构3. StreamingContext结构成员描述StateState属性获取传输数据的源或目标。它是一个只读属性。在序列化期间,该属性指定传输数据的目标。在反序列化期间,该属性指出反序列化流的源。State属性接受枚举值,StreamingContextStates,该值提供关于所发生的序列化类型的信息。StreamingContextStates枚举拥有下列成员:All:该成员指定可向任何上下文传输或从任何上下文接收序列化的数据。Clone:该成员指定正在克隆对象图而不影响原始对象。在这种情形下,可以假定克隆图将继续与原始对象图在同一进程中存在。CrossAppDomain:该成员指定序列化数据的源或目标上下文是另一个应用程序域。CrossMachine:该成员指定序列化数据的源或目标上下文是另一台计算机。CrossProcess:该成员指定序列化数据的源或目标上下文是同一计算机上的另一个进程。File:该成员指定序列化数据的源或目标是一个文件。Other:该成员指定序列化上下文未知,这意味着其上下文状态不是其他可能的上下文状态(例如File、Remoting或CrossMachine)中的任何一个。可以使用该成员覆盖开发期间可能引发的意外情况。Persistence:该成员指定序列化数据的源或目标上下文是永久的存储区,例如数据库、文件或其他后备存储区。Remoting:该成员指定序列化的数据用于一个远程上下文中,该远程上下文可为未知位置中的另一台计算机。CrossAppDomain、CrossMachine、CrossProcess和File成员将覆盖一个在分布式环境(可以跨应用程序域、进程、文件或计算机)中共享数据的应用程序。这将在分布式环境中启用应用程序缩放功能。ContextContext属性获取指定作为调用方定义的附加上下文一部分的上下文。使用该属性,可以将任何用户定义的值传递给StreamingContext结构。该属性是一个只读属性并可以返回一个空引用。代码示例C#代码示例VBStreamingContext结构3. StreamiISerializableIDeserializationCallbackIFormatterIFormatterConverter使用序列化接口

创建自定义类7.3.2 使用序列化接口创建自定义类.NETFramework提供了序列化接口,这些接口由启用序列化功能的所有内置类来实现。代码示例C#代码示例VBISerializable使用序列化接口

创建自定义类7Formatter类

FormatterConverter类

FormatterServices类

使用格式化程序类将

数据转换为序列化格式7.3.3 使用格式化程序类将数据转换为序列化格式.NETFramework提供了三种格式化程序类:Formatter类使用格式化程序类将

数据转换为序列事件处理程序属性使用事件处理程序

属性处理序列化事件7.3.4 使用事件处理程序属性处理序列化事件事件处理程序属性描述OnSerializingAttribute

当应用于类中的某个特定方法时,该属性指定在对象序列化之前执行该方法。OnSerializedAttribute

当应用于某个方法时,该属性指定在对象序列化之后必须执行该方法。事件处理程序属性使用事件处理程序

属性处理序列化事件7.使用事件处理程序

属性处理序列化事件(续)7.3.4 使用事件处理程序属性处理序列化事件OnDeserializingAttribute

当应用于类中的某个特定方法时,该属性指定恰好在对相应类的对象进行反序列化之前必须执行的方法。OnDeserializedAttribute

当应用于类中的某个特定方法时,该属性指定在对相应类的对象进行反序列化之后必须执行的方法。OptionalFieldAttribute

该属性可将类的成员标记为可选的。这启用了为序列化数据的应用程序的旧版本而创建的多种类型的版本兼容序列化。在大多数情况下,反序列化期间,如果在相应的序列化流中没有找到某种类型的成员,则运行时将生成一个异常。如果被序列化的某种类型在其后续版本中添加成员,而该序列化流只表示旧版本的一个对象,则就会引发此种情形。如果为新成员指定该属性,则它可正常处理旧数据,而格式化程序不会引发任何异常。该属性的优点在于允许灵活修改要被序列化或反序列化的类。续表:使用事件处理程序

属性处理序列化事件(续)7.3.4 使用ObjectManager类的常用方法使用ObjectManager类

管理反序列化的对象7.3.5 使用ObjectManager类管理反序列化的对象方法描述DoFixupsDoFixups方法执行所有记录的修正。这些修正由任何在System.Serializable中定义的合适的代理来执行,或者是对象本身(如果它实现ISerializable),或者是默认代理(在System.Serializable中定义)。GetObjectGetObject方法用于检索一个使用相应ObjectManager实例注册的对象,该实例基于一个指定为该方法的参数的对象ID。如果尚未使用指定ID注册这样的对象,则该方法返回null。代码示例C#代码示例VBObjectManager类的常用方法使用ObjectMa使用ObjectManager类

管理反序列化的对象(续)7.3.5 使用ObjectManager类管理反序列化的对象RaiseDeserializationEventRaiseDeserializationEvent方法对任何实现IDeserializationCallback的注册对象引发反序列化事件。IDeserializationCallback接口将通知反序列化对象的时间。RecordArrayElementFixupRecordArrayElementFixup方法记录数组中一个元素的修正,以便在稍后执行。该方法拥有两个签名:RecordArrayElementFixup(Int64,Int32,Int64):在此签名中,修正是针对特定数组的特定元素,且修正进程期间所使用的值由objectRequired参数提供。RecordArrayElementFixup(Int64,Int32[],Int64):在此签名中,修正是针对特定数组的所有元素,且修正进程期间所使用的值由objectRequired参数提供。此方法与前一方法的惟一不同之处在于:此方法传递一个整数数组,而前一方法传递单个整数值。续表:使用ObjectManager类

管理反序列化的对象(续)使用ObjectManager类

管理反序列化的对象(续)7.3.5 使用ObjectManager类管理反序列化的对象RecordDelayedFixupRecordDelayedFixup方法记录对象成员的修正,以便在稍后执行。该方法使用三个参数:objectToBeFixed:指示要修正的对象的ID。memberName:一个将在其中执行修正的objectToBeFixed的字符串。objectRequired:指示所需对象的ID。修正是针对特定对象的特定成员,且将修正进程期间所使用的值提供为objectRequired参数。RecordFixupRecordFixup方法记录对象成员的修正,以便在稍后执行。该方法使用三个参数:objectToBeFixed:指示需要objectRequired对象引用的对象ID。Member:指示将在其中执行修正的objectToBeFixed的成员。objectRequired:指示objectToBeFixed所需对象的ID。修正是针对特定对象的特定成员,且将修正进程期间所使用的值提供为objectRequired参数。虽然RecordDelayedFixup方法和RecordFixup方法都执行相同的任务,但是它们的参数列表是不同的。RecordFixup方法接受要执行修正的成员作为MemberInfo类的一个对象,而RecordDelayedFixup接受该成员的名称作为一个字符串,而非MemberInfo对象。续表:使用ObjectManager类

管理反序列化的对象(续使用ObjectManager类

管理反序列化的对象(续)7.3.5 使用ObjectManager类管理反序列化的对象RegisterObjectRegisterObject方法在对象反序列化时使用ObjectManager注册该对象。该方法拥有四个签名:RegisterObjectMethod(Object,Int64):该方法在对象反序列化时注册该对象,并使其与objected关联。RegisterObjectMethod(Object,Int64,SerializationInfo):该方法在对象反序列化时注册该对象,使其与objected关联,并记录其所使用的SerializationInfo。如果该对象执行ISerializable或拥有一个ISerializationSurrogate,则会使用SerializationInfo。RegisterObjectMethod(Object,Int64,SerializationInfo,Int64,MemberInfo):该方法在对象反序列化时注册该对象的成员,使该对象与objectID关联,并记录SerializationInfo。只有当该对象为ValueType时,MemberInfo参数才发挥作用,这是因为存储ValueType的信息的空间是与其所包含的对象一起内联分配的。RegisterObjectMethod(Object,Int64,SerializationInfo,Int64,MemberInfo,Int32[]):该方法在对象反序列化时注册该对象中所包含的数组的成员。如果该对象既是ValueType又是数组的成员,则arrayIndex参数将包含该对象在该数组中的索引。如果该对象既不是ValueType又不是数组的成员,则忽略arrayIndex。续表:使用ObjectManager类

管理反序列化的对象(续生成序列化的二进制格式和SOAP格式生成序列化的XML格式创建自定义序列化类

小结实验习题第7章数据的序列化生成序列化的二进制格式和SOAP格式第7章数据的序7.4 小结本章学习了数据的序列化。在.NETFramework中,对象可以使用多种格式序列化。常用的格式有二进制格式和Soap格式。BinaryFormatter类和SoapFormatter类提供了对应的功能。还可以使用XmlSerializer类和序列化属性将对象序列化为XML格式。小结7.4 小结本章学习了数据的序列化。在.NETFramew生成序列化的二进制格式和SOAP格式生成序列化的XML格式创建自定义序列化类

小结实验习题第7章数据的序列化生成序列化的二进制格式和SOAP格式第7章数据的序实验7.5 实验参照实验手册,并在教师指导下完成实验报告。实验7.5 实验参照实验手册,并在教师指导下完成实验报告。生成序列化的二进制格式和SOAP格式生成序列化的XML格式创建自定义序列化类

小结实验习题第7章数据的序列化生成序列化的二进制格式和SOAP格式第7章数据的序习题7.6 习题1. 在应用程序中你使用lSerializer以将对象序列化到硬盘上的一个XML文件中。作为默认行为,XmlSerializer将对象中所提供的多个公共成员序列化为该XML文件中的元素。要以一种更好的结构格式来安排该XML文件中的数据,则需要将某些成员序列化为属性,而将其他数组类型的成员序列化为序列化的数组。此外,你想用该XML文件中的一些自定义名称来表示这些成员,而不是用对该类中的这些成员定义时所使用的名称。以下哪种功能将帮助你实现以上要求?请选择所有符合条件的答案。A.IXmlSerializable接口B.XML序列化属性C.XML序列化委托D.XML架构习题7.6 习题1. 在应用程序中你使用lSerializ习题(续)2. 你已创建一个分布式应用程序,它允许客户登录到信息销售系统并提供信息。这些信息可以同时从几个位置收集,你需要确定客户及其相关信息。.NETFramework序列化体系结构提供了三种序列化类型,用来指定以序列化格式表示对象所需要的某些值,并在反序列化期间相应地检索这些值。你需要提供关于某个特定序列化流的源和目标的信息。你将选择以下哪种方法?请选择所有符合条件的答案。A.Serialize方法B.SerializationEntry结构C.SerializationInfo类D.StreamingContext结构7.6 习题习题(续)2. 你已创建一个分布式应用程序,它允许客户登录到习题(续)3. 你通过使用VisualStudio.NET创建了一个应用程序,它帮助你为人力资源部门收集几条关键雇员数据。这些信息必须从面试、工作申请、简历以及必须填写的雇员表格中收集。这里存在一个处理要收集数据的顺序。在收集完这些信息后,将其序列化并存储以供人力资源部门进一步处理。.NETFramework并未提供预定义规则,用以管理对象的反序列化顺序/序列。如果对象之间存在依赖关系或者需要序列化的对象的顺序关系很重要,则你需要注意该对象完全被反序列化的时间。下列哪种接口将帮助你实现此功能?请选择所有符合条件的答案。A.IDeserializationCallbackB.ISerializableC.IFormatterD.IFormatterConverter7.6 习题习题(续)3. 你通过使用VisualStudio.NE第7章 数据的序列化第7章 数据的序列化.NETFramework2.0程序设计第1章:.NETFramework2.0简介

第2章:公共语言运行库和类型第3章:托管代码的编译和执行第4章:委托和事件第5章:读取和写入文件第6章:集合和泛型第7章:数据的序列化

第8章:GDI+第9章:在.NETFramework2.0中实现加密第10章:COM组件与.NETFramework程序集之间的交互操作第11章:使用类型元数据第12章:创建多线程应用程序和应用程序域第13章:代码访问安全性第14章:监视和调试应用程序第15章:使用服务应用程序和电子邮件消息第16章:创建全球化应用程序第17章:配置和安装程序集.NETFramework2.0程序设计第1章:本章学习目标:通过BinaryFormatter类和SoapFormatter类,将对象序列化为二进制格式和SOAP格式

通过XmlSerializer类、IXmlSerializable接口及XML序列化属性和委托,将对象序列化为自定义XML格式创建自定义序列化类

目标本章学习目标:目标生成序列化的二进制格式和SOAP格式生成序列化的XML格式创建自定义序列化类

小结实验习题第7章数据的序列化生成序列化的二进制格式和SOAP格式第7章数据的序生成序列化的二进制

格式和SOAP格式7.1 生成序列化的二进制格式和SOAP格式对象数据的传输序列化和反序列化代码示例VB生成序列化的二进制

格式和SOAP格式7.1 生成序列.BinaryFormatter类的成员BinaryFormatter类的成员7.1.1 BinaryFormatter类的成员成员描述AssemblyFormat属性AssemblyFormat属性定义或返回用于序列化程序集名称的程序集格式。该返回值取决于FormatterAssemblyStyle枚举(拥有两个成员:Full和Simple)的值。在程序集格式为Full的情况下,程序集描述包括程序集名称、所保存的对象的全球文化以及程序集的版本和公钥标志。在程序集格式为Simple的情况下,程序集描述仅由程序集名称组成。Binder属性Binder属性定义或返回一个SerializationBinder类的对象,该对象用于控制将序列化对象绑定到类型的过程。这里,类型是指在序列化过程中用于加载序列化对象的自定义类型,而非该序列化对象的实际类型。在对象被反序列化时,这将有助于你选择所要的对象类型。例如,雇员信息原来以Employee类型进行保存,稍后,由于雇员要从公司商店购买一些产品,所以要序列化该雇员信息。因此,你需要将该雇员信息以Customer类型进行反序列化。通过SerializationBinder类可加载自定义类型,以替代由序列化引擎执行的默认加载,这意味着可以更改序列化对象的默认行为。另外,还可以通过使用SerializationBinder来检查应用程序域中加载的类型。这将有助于维护包含拒绝类型的黑名单和允许类型的白名单,并限制被加载和实例化的类型。.BinaryFormatter类的成员BinaryFor.BinaryFormatter类的成员(续)7.1.1 BinaryFormatter类的成员Context属性Context属性定义或返回BinaryFormatter的StreamingContext。StreamingContext结构指示格式化程序所使用的位的源或目标。FilterLevel属性FilterLevel属性定义或返回BinaryFormatter所执行的自动反序列化的TypeFilterLevel枚举类型的值。该值取决于TypeFilterLevel枚举所指定的值,可为Low或Full。Low反序列化级别是.NETFramework中的默认值。它仅对与最基本的远程处理功能相关联的类型进行反序列化,从而抵御反序列化攻击。反序列化攻击允许未授权用户拦截消息,并读取或更改该消息中的信息。Low反序列化级别支持的类型有:远程处理基础结构对象、基元类型、引用类型以及值类型。Full反序列化级别支持对所有这些类型的自动反序列化,即在任何情况下受远程处理支持的类型。续表:.BinaryFormatter类的7.1.1 Binary.SurrogateSelector属性SurrogateSelector属性定义或返回ISurrogateSelector接口,以控制序列化和反序列化过程中的类型替换。ISurrogateSelector接口属于System.Runtime.Serialization命名空间。使用SurrogateSelector属性,未标记为可序列化的对象也可被序列化。假设一个示例,其中你创建一个Customer类型的对象,但是不能将其标记为Serializable。因此,你创建一个ISurrogateSelector接口的类型,并将SurrogateSelector属性设置为该类型的对象,以将Customer类型指向到已标记为可序列化的Person类型。这允许序列化对象的Customer类型。TypeFormat属性TypeFormat属性定义或返回类型说明在序列化流中的布局格式。该属性接收一个FormatterTypeStyle枚举类型的值,该枚举类型拥有以下成员:TypesAlways:指示可为所有对象和ISerializable对象成员提供类型。TypesWhenNeeded:指示只能为对象数组、Object类型的对象成员以及ISerializable非基元值类型(例如结构和枚举)声明类型。XsdString:指示可以XSD格式(而非SOAP格式)提供字符串。7.1.1 BinaryFormatter类的成员续表续表:.SurrogateSelector属性Surrogate.DeSerialize方法DeSerialize方法将指定的流反序列化为对象图。如果反序列化成功,则该流中的当前位置必须位于对象图的开头。该方法将返回该对象图的顶级对象。Deserialize方法拥有两种重载形式:BinaryFormatter.Deserialize(Stream):此形式将指定的流反序列化为对象图。BinaryFormatter.Deserialize(Stream,HeaderHandler):此形式也将指定的流反序列化为对象图。另外,此形式中提供的HeaderHandler参数将处理该流中的所有标题对象。标题对象传达关于远程函数调用的信息。标题对象的一些例子包括事务ID或方法签名。如果创建HeaderHandler,则需要确定要处理该事件的方法。Serialize方法Serialize方法将对象或具有指定头的对象图序列化为给定的流。Serialize方法拥有以下两种重载形式:BinaryFormatter.Serialize(Stream,Object):此形式将对象或具有指定头的对象图序列化为给定的流。BinaryFormatter.Serialize(Stream,Object,Header[]):此形式通过附加所提供的标题,也将对象或具有指定头的对象图序列化为给定的流。所包括的标题将有助于传输关于消息如何处理的信息。序列化进程包含序列化流的开始处的标题参数所提供的信息。7.1.1 BinaryFormatter类的成员续表续表:.DeSerialize方法DeSerialize方法将.SoapFormatter类的成员SoapFormatter类的成员7.1.2 SoapFormatter类的成员成员描述AssemblyFormat属性AssemblyFormat属性定义或返回用于序列化程序集名称的格式。此属性使用在生成的SOAP信息中程序集引用的FormatterAssemblyStyle枚举格式。当反序列化一个对象时,这些引用可用于定位程序集。该属性只应用于消息的格式,而不应用于序列化对象的格式,这是由于序列化对象的格式是通过选择BinaryFormatter或SoapFormatter来控制的。Binder属性在SoapFormatter类中关于此属性的描述与BinaryFormatte类中的描述相同。.SoapFormatter类的成员SoapFormatt.7.1.2 SoapFormatter类的成员Context属性Context属性定义或返回和SoapFormatter一起使用的StreamingContext。StreamingContext包含关于序列化消息的目标的信息,可允许目标对象为其接收的对象确定正确的上下文。例如,你已从Person类派生了许多类型,且Customer类型即是其中一个。当序列化Person类型的一个对象时,你希望该对象能告知目标它是Customer类型。Context属性被传递给处理自己的序列化的对象。FilterLevel属性FilterLevel属性定义或返回自动反序列化的TypeFilterLevel枚举类型的值,以用于.NETFramework远程处理。该值取决于TypeFilterLevel枚举所指定的值,可为Low或Full。该属性在SoapFormatter中支持的Low和Full反序列化级别类型和在BinaryFormatter中所支持的相同。SurrogateSelector属性SurrogateSelector属性定义或返回ISurrogateSelector类,以控制序列化和反序列化过程中的类型替换。该类属于System.Runtime.Serialization命名空间。ISurrogateSelector指定一个替换类型以控制未定义为可序列化的特定类型的序列化过程。序列化代理提供一个对象,以处理另一个对象的序列化要求,并在必要时转换序列化数据。SoapFormatter类的成员(续)续表:.7.1.2 SoapFormatter类的成员Contex.7.1.2 SoapFormatter类的成员TopObject属性TopObject属性定义或返回ISoapMessage,一个在传输字节过程中用于发送和接收的消息类型,其中可反序列化SOAP顶级对象。TopObject属性设置ISoapMessage以接收具有反序列化RPC(RemoteProcedureCall,远程过程调用)格式的消息中的数据。TypeFormat属性TypeFormat属性定义或返回类型说明在序列化流中的布局格式。该属性控制当SOAP消息中生成对象引用标识符时的格式类型。该属性接收一个FormatterTypeStyle枚举类型的值,该枚举类型拥有以下成员:TypesAlwaysTypesWhenNeededXsdStringSoapFormatter类的成员(续)续表:.7.1.2 SoapFormatter类的成员TopObj.续表:7.1.2 SoapFormatter类的成员DeSerialize方法DeSerialize方法将提供流上的数据反序列化,并在接收位置重组对象图。SoapFormatter提供了Deserialize方法的下列两个版本:Deserialize(Stream):该方法存储包含要被反序列化的数据的流,并返回该反序列化图形的顶级对象。Deserialize(Stream,HeaderHandler):该方法将流反序列化为对象图,并由指定的委托来处理流中的任何头,以对在流中找到的任何头对象进行处理。

Serialize方法Serialize方法将对象或具有指定根

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论