使用ObjectManager類管理反序列化的對(duì)象課件_第1頁
使用ObjectManager類管理反序列化的對(duì)象課件_第2頁
使用ObjectManager類管理反序列化的對(duì)象課件_第3頁
使用ObjectManager類管理反序列化的對(duì)象課件_第4頁
使用ObjectManager類管理反序列化的對(duì)象課件_第5頁
已閱讀5頁,還剩91頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第7章 數(shù)據(jù)的序列化第7章 數(shù)據(jù)的序列化.NETFramework2.0程序設(shè)計(jì)第1章:.NETFramework2.0簡(jiǎn)介

第2章:公共語言運(yùn)行庫和類型第3章:托管代碼的編譯和執(zhí)行第4章:委托和事件第5章:讀取和寫入文件第6章:集合和泛型第7章:數(shù)據(jù)的序列化

第8章:GDI+第9章:在.NETFramework2.0中實(shí)現(xiàn)加密第10章:COM組件與.NETFramework程序集之間的交互操作第11章:使用類型元數(shù)據(jù)第12章:創(chuàng)建多線程應(yīng)用程序和應(yīng)用程序域第13章:代碼訪問安全性第14章:監(jiān)視和調(diào)試應(yīng)用程序第15章:使用服務(wù)應(yīng)用程序和電子郵件消息第16章:創(chuàng)建全球化應(yīng)用程序第17章:配置和安裝程序集.NETFramework2.0程序設(shè)計(jì)第1章:本章學(xué)習(xí)目標(biāo):通過BinaryFormatter類和SoapFormatter類,將對(duì)象序列化為二進(jìn)制格式和SOAP格式

通過XmlSerializer類、IXmlSerializable接口及XML序列化屬性和委托,將對(duì)象序列化為自定義XML格式創(chuàng)建自定義序列化類

目標(biāo)本章學(xué)習(xí)目標(biāo):目標(biāo)生成序列化的二進(jìn)制格式和SOAP格式生成序列化的XML格式創(chuàng)建自定義序列化類

小結(jié)實(shí)驗(yàn)習(xí)題第7章數(shù)據(jù)的序列化生成序列化的二進(jìn)制格式和SOAP格式第7章數(shù)據(jù)的序生成序列化的二進(jìn)制

格式和SOAP格式7.1 生成序列化的二進(jìn)制格式和SOAP格式對(duì)象數(shù)據(jù)的傳輸序列化和反序列化代碼示例VB生成序列化的二進(jìn)制

格式和SOAP格式7.1 生成序列.BinaryFormatter類的成員BinaryFormatter類的成員7.1.1 BinaryFormatter類的成員成員描述AssemblyFormat屬性AssemblyFormat屬性定義或返回用于序列化程序集名稱的程序集格式。該返回值取決于FormatterAssemblyStyle枚舉(擁有兩個(gè)成員:Full和Simple)的值。在程序集格式為Full的情況下,程序集描述包括程序集名稱、所保存的對(duì)象的全球文化以及程序集的版本和公鑰標(biāo)志。在程序集格式為Simple的情況下,程序集描述僅由程序集名稱組成。Binder屬性Binder屬性定義或返回一個(gè)SerializationBinder類的對(duì)象,該對(duì)象用于控制將序列化對(duì)象綁定到類型的過程。這里,類型是指在序列化過程中用于加載序列化對(duì)象的自定義類型,而非該序列化對(duì)象的實(shí)際類型。在對(duì)象被反序列化時(shí),這將有助于你選擇所要的對(duì)象類型。例如,雇員信息原來以Employee類型進(jìn)行保存,稍后,由于雇員要從公司商店購買一些產(chǎn)品,所以要序列化該雇員信息。因此,你需要將該雇員信息以Customer類型進(jìn)行反序列化。通過SerializationBinder類可加載自定義類型,以替代由序列化引擎執(zhí)行的默認(rèn)加載,這意味著可以更改序列化對(duì)象的默認(rèn)行為。另外,還可以通過使用SerializationBinder來檢查應(yīng)用程序域中加載的類型。這將有助于維護(hù)包含拒絕類型的黑名單和允許類型的白名單,并限制被加載和實(shí)例化的類型。.BinaryFormatter類的成員BinaryFor.BinaryFormatter類的成員(續(xù))7.1.1 BinaryFormatter類的成員Context屬性Context屬性定義或返回BinaryFormatter的StreamingContext。StreamingContext結(jié)構(gòu)指示格式化程序所使用的位的源或目標(biāo)。FilterLevel屬性FilterLevel屬性定義或返回BinaryFormatter所執(zhí)行的自動(dòng)反序列化的TypeFilterLevel枚舉類型的值。該值取決于TypeFilterLevel枚舉所指定的值,可為Low或Full。Low反序列化級(jí)別是.NETFramework中的默認(rèn)值。它僅對(duì)與最基本的遠(yuǎn)程處理功能相關(guān)聯(lián)的類型進(jìn)行反序列化,從而抵御反序列化攻擊。反序列化攻擊允許未授權(quán)用戶攔截消息,并讀取或更改該消息中的信息。Low反序列化級(jí)別支持的類型有:遠(yuǎn)程處理基礎(chǔ)結(jié)構(gòu)對(duì)象、基元類型、引用類型以及值類型。Full反序列化級(jí)別支持對(duì)所有這些類型的自動(dòng)反序列化,即在任何情況下受遠(yuǎn)程處理支持的類型。續(xù)表:.BinaryFormatter類的7.1.1 Binary.SurrogateSelector屬性SurrogateSelector屬性定義或返回ISurrogateSelector接口,以控制序列化和反序列化過程中的類型替換。ISurrogateSelector接口屬于System.Runtime.Serialization命名空間。使用SurrogateSelector屬性,未標(biāo)記為可序列化的對(duì)象也可被序列化。假設(shè)一個(gè)示例,其中你創(chuàng)建一個(gè)Customer類型的對(duì)象,但是不能將其標(biāo)記為Serializable。因此,你創(chuàng)建一個(gè)ISurrogateSelector接口的類型,并將SurrogateSelector屬性設(shè)置為該類型的對(duì)象,以將Customer類型指向到已標(biāo)記為可序列化的Person類型。這允許序列化對(duì)象的Customer類型。TypeFormat屬性TypeFormat屬性定義或返回類型說明在序列化流中的布局格式。該屬性接收一個(gè)FormatterTypeStyle枚舉類型的值,該枚舉類型擁有以下成員:TypesAlways:指示可為所有對(duì)象和ISerializable對(duì)象成員提供類型。TypesWhenNeeded:指示只能為對(duì)象數(shù)組、Object類型的對(duì)象成員以及ISerializable非基元值類型(例如結(jié)構(gòu)和枚舉)聲明類型。XsdString:指示可以XSD格式(而非SOAP格式)提供字符串。7.1.1 BinaryFormatter類的成員續(xù)表續(xù)表:.SurrogateSelector屬性Surrogate.DeSerialize方法DeSerialize方法將指定的流反序列化為對(duì)象圖。如果反序列化成功,則該流中的當(dāng)前位置必須位于對(duì)象圖的開頭。該方法將返回該對(duì)象圖的頂級(jí)對(duì)象。Deserialize方法擁有兩種重載形式:BinaryFormatter.Deserialize(Stream):此形式將指定的流反序列化為對(duì)象圖。BinaryFormatter.Deserialize(Stream,HeaderHandler):此形式也將指定的流反序列化為對(duì)象圖。另外,此形式中提供的HeaderHandler參數(shù)將處理該流中的所有標(biāo)題對(duì)象。標(biāo)題對(duì)象傳達(dá)關(guān)于遠(yuǎn)程函數(shù)調(diào)用的信息。標(biāo)題對(duì)象的一些例子包括事務(wù)ID或方法簽名。如果創(chuàng)建HeaderHandler,則需要確定要處理該事件的方法。Serialize方法Serialize方法將對(duì)象或具有指定頭的對(duì)象圖序列化為給定的流。Serialize方法擁有以下兩種重載形式:BinaryFormatter.Serialize(Stream,Object):此形式將對(duì)象或具有指定頭的對(duì)象圖序列化為給定的流。BinaryFormatter.Serialize(Stream,Object,Header[]):此形式通過附加所提供的標(biāo)題,也將對(duì)象或具有指定頭的對(duì)象圖序列化為給定的流。所包括的標(biāo)題將有助于傳輸關(guān)于消息如何處理的信息。序列化進(jìn)程包含序列化流的開始處的標(biāo)題參數(shù)所提供的信息。7.1.1 BinaryFormatter類的成員續(xù)表續(xù)表:.DeSerialize方法DeSerialize方法將.SoapFormatter類的成員SoapFormatter類的成員7.1.2 SoapFormatter類的成員成員描述AssemblyFormat屬性AssemblyFormat屬性定義或返回用于序列化程序集名稱的格式。此屬性使用在生成的SOAP信息中程序集引用的FormatterAssemblyStyle枚舉格式。當(dāng)反序列化一個(gè)對(duì)象時(shí),這些引用可用于定位程序集。該屬性只應(yīng)用于消息的格式,而不應(yīng)用于序列化對(duì)象的格式,這是由于序列化對(duì)象的格式是通過選擇BinaryFormatter或SoapFormatter來控制的。Binder屬性在SoapFormatter類中關(guān)于此屬性的描述與BinaryFormatte類中的描述相同。.SoapFormatter類的成員SoapFormatt.7.1.2 SoapFormatter類的成員Context屬性Context屬性定義或返回和SoapFormatter一起使用的StreamingContext。StreamingContext包含關(guān)于序列化消息的目標(biāo)的信息,可允許目標(biāo)對(duì)象為其接收的對(duì)象確定正確的上下文。例如,你已從Person類派生了許多類型,且Customer類型即是其中一個(gè)。當(dāng)序列化Person類型的一個(gè)對(duì)象時(shí),你希望該對(duì)象能告知目標(biāo)它是Customer類型。Context屬性被傳遞給處理自己的序列化的對(duì)象。FilterLevel屬性FilterLevel屬性定義或返回自動(dòng)反序列化的TypeFilterLevel枚舉類型的值,以用于.NETFramework遠(yuǎn)程處理。該值取決于TypeFilterLevel枚舉所指定的值,可為Low或Full。該屬性在SoapFormatter中支持的Low和Full反序列化級(jí)別類型和在BinaryFormatter中所支持的相同。SurrogateSelector屬性SurrogateSelector屬性定義或返回ISurrogateSelector類,以控制序列化和反序列化過程中的類型替換。該類屬于System.Runtime.Serialization命名空間。ISurrogateSelector指定一個(gè)替換類型以控制未定義為可序列化的特定類型的序列化過程。序列化代理提供一個(gè)對(duì)象,以處理另一個(gè)對(duì)象的序列化要求,并在必要時(shí)轉(zhuǎn)換序列化數(shù)據(jù)。SoapFormatter類的成員(續(xù))續(xù)表:.7.1.2 SoapFormatter類的成員Contex.7.1.2 SoapFormatter類的成員TopObject屬性TopObject屬性定義或返回ISoapMessage,一個(gè)在傳輸字節(jié)過程中用于發(fā)送和接收的消息類型,其中可反序列化SOAP頂級(jí)對(duì)象。TopObject屬性設(shè)置ISoapMessage以接收具有反序列化RPC(RemoteProcedureCall,遠(yuǎn)程過程調(diào)用)格式的消息中的數(shù)據(jù)。TypeFormat屬性TypeFormat屬性定義或返回類型說明在序列化流中的布局格式。該屬性控制當(dāng)SOAP消息中生成對(duì)象引用標(biāo)識(shí)符時(shí)的格式類型。該屬性接收一個(gè)FormatterTypeStyle枚舉類型的值,該枚舉類型擁有以下成員:TypesAlwaysTypesWhenNeededXsdStringSoapFormatter類的成員(續(xù))續(xù)表:.7.1.2 SoapFormatter類的成員TopObj.續(xù)表:7.1.2 SoapFormatter類的成員DeSerialize方法DeSerialize方法將提供流上的數(shù)據(jù)反序列化,并在接收位置重組對(duì)象圖。SoapFormatter提供了Deserialize方法的下列兩個(gè)版本:Deserialize(Stream):該方法存儲(chǔ)包含要被反序列化的數(shù)據(jù)的流,并返回該反序列化圖形的頂級(jí)對(duì)象。Deserialize(Stream,HeaderHandler):該方法將流反序列化為對(duì)象圖,并由指定的委托來處理流中的任何頭,以對(duì)在流中找到的任何頭對(duì)象進(jìn)行處理。

Serialize方法Serialize方法將對(duì)象或具有指定根的對(duì)象圖序列化為給定的流。SoapFormatter提供了Serialize方法的以下兩個(gè)版本:Serialize(Stream,Object):此方法將嵌入到SOAP消息正文內(nèi)的對(duì)象序列化為指定的流。Serialize(Stream,Object,Header[]):此方法也將嵌入到SOAP消息正文內(nèi)的對(duì)象序列化為指定的流,但是標(biāo)題數(shù)組將指定要包含在SOAP消息中的標(biāo)題。該方法為序列化的對(duì)象創(chuàng)建包含正文部分和標(biāo)題部分的消息。SoapFormatter類的成員(續(xù)).續(xù)表:7.1.2 SoapFormatter類的成員DeS生成序列化的二進(jìn)制格式和SOAP格式生成序列化的XML格式創(chuàng)建自定義序列化類

小結(jié)實(shí)驗(yàn)習(xí)題第7章數(shù)據(jù)的序列化生成序列化的二進(jìn)制格式和SOAP格式第7章數(shù)據(jù)的序使用XmlSerializer類將對(duì)象序列化為XML格式

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

.生成序列化的XML格式7.2 生成序列化的XML格式XML是一種開放式標(biāo)準(zhǔn)。XML序列化是一個(gè)將對(duì)象的公共屬性和字段轉(zhuǎn)換為序列化的XML格式以達(dá)到存儲(chǔ)或傳輸目的的過程。XML序列化還可用于將對(duì)象序列化為遵循SOAP規(guī)范的XML流。使用XmlSerializer類將對(duì)象序列化為XML格XmlSerializer類中最常用的方法使用XmlSerializer類將對(duì)象序列化為XML格式7.2.1 使用XmlSerializer類將對(duì)象序列化為XML格式方法描述CanDeserializeCanDeserialize方法將檢查XmlSerializer類能否反序列化指定的XML文檔。該方法將接受XmlReader作為一個(gè)指向反序列化的文檔的參數(shù)。如果XmlSerializer類能反序列化XmlReader所指向的對(duì)象,則CanDeserialize方法將返回true。否則,它將返回false。DeserializeDeserialize方法將XML文檔反序列化為其原始狀態(tài)。該方法通過使用反序列化的對(duì)象的類型來構(gòu)造XmlSerializer類。它從XML文檔讀取并構(gòu)造一個(gè)對(duì)象,該對(duì)象的類型即是構(gòu)造XmlSerializer時(shí)所使用的相應(yīng)類型。當(dāng)解析XML時(shí),數(shù)據(jù)被轉(zhuǎn)換為該對(duì)象的有關(guān)成員的數(shù)據(jù)類型??梢杂枚喾N格式指定要反序列化的XML文檔,例如Stream、TextReader和XMLReader。因此,Deserialize方法擁有以下重載形式:XmlSerializer.Deserialize(Stream):該形式對(duì)指定流中包含的XML文檔進(jìn)行反序列化。該流提供了一系列字節(jié)的泛型視圖。XmlSerializer.Deserialize(TextReader):該形式對(duì)指定的TextReader所包含的XML文檔進(jìn)行反序列化。TextReader表示一個(gè)可以讀取一組連續(xù)字符的讀取器。XmlSerializer.Deserialize(XmlReader):該形式對(duì)指定的XmlReader所包含的XML文檔進(jìn)行反序列化。XmlReader表示一個(gè)提供快速、非緩存和只進(jìn)訪問XML數(shù)據(jù)的讀取器。XmlSerializer類中最常用的方法使用XmlS7.2.1 使用XmlSerializer類將對(duì)象序列化為XML格式FromTypesFromTypes方法將返回從類型數(shù)組中創(chuàng)建的XmlSerializer對(duì)象數(shù)組。該方法有助于創(chuàng)建XmlSerializer對(duì)象數(shù)組,以處理Type對(duì)象數(shù)組。SerializeSerialize方法將對(duì)象序列化到XML文檔。該方法擁有多種重載形式。其中的一些重載形式如下:Serialize(Stream,Object):序列化指定的對(duì)象并使用指定的流將XML文檔寫入文件。Serialize(TextWriter,Object):序列化指定的對(duì)象并使用指定的TextWriter將XML文檔寫入文件。Serialize(XmlWriter,Object):序列化指定的對(duì)象并使用指定的XmlWriter將XML文檔寫入文件。每種重載形式允許使用不同的方法將特定對(duì)象序列化為指定的流。一些重載還允許將XML命名空間的引用指定到生成的XML中。代碼示例C#使用XmlSerializer類將對(duì)象序列化為XML格式(續(xù))續(xù)表:7.2.1 使用XmlSerializer類將FromTy自定義XML格式的屬性7.2.2 使用XML序列化屬性控制生成的XML屬性描述XmlAnyAttributeAttributeXmlAnyAttributeAttribute包含作為XML文檔的一部分進(jìn)行發(fā)送的任意數(shù)據(jù)(作為元素的屬性)。該屬性的用途是建立一個(gè)字段或?qū)傩?,以接收沒有映射到類的字段或?qū)傩缘腦ML屬性。XmlAnyAttributeAttribute可以應(yīng)用于一個(gè)表示XmlAttribute或XmlNode對(duì)象數(shù)組的字段。XmlAttribute表示XML元素的某個(gè)屬性,而XmlNode表示XML文檔中的單個(gè)節(jié)點(diǎn)。如果指定了該屬性,則在反序列化之后,不具有該反序列化類的相應(yīng)成員的所有XML屬性,將被收集在一個(gè)數(shù)組中。該數(shù)組可循環(huán)訪問,以在反序列化之后處理這些值。XmlAnyElementAttributeXmlAnyElementAttribute包含任意以XML文檔元素的形式進(jìn)行發(fā)送的數(shù)據(jù)。該屬性的用途是建立一個(gè)字段或?qū)傩?,以接收那些未映射到類的字段或?qū)傩缘腦ML元素。XmlAnyElementAttribute應(yīng)用于一個(gè)返回XmlElement或XmlNode對(duì)象數(shù)組的字段。XmlElement表示一個(gè)XML元素,而XmlNode表示XML文檔中的單個(gè)節(jié)點(diǎn)。可將XmlAnyElementAttribute應(yīng)用于XmlElement類型的字段中。使用XML序列化屬性

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

控制生成的XML(續(xù))7.2.2 使用XML序列化屬性控制生成的XMLXmlArrayAttributeXmlArrayAttribute旨在控制數(shù)組的序列化。該屬性指示XmlSerializer將特定的類成員序列化為XML元素?cái)?shù)組。通過應(yīng)用XmlArrayAttribute,可以確定生成的XML元素的屬性,還可以更改XML元素的名稱。XmlArrayItemAttributeXmlArrayItemAttribute旨在控制數(shù)組的序列化。它允許派生類的序列化,并指定可以被XmlSerializer放入序列化的數(shù)組的派生類型??梢允褂肵mlArrayItemAttribute的多個(gè)實(shí)例,每個(gè)實(shí)例之間以逗號(hào)分隔,以指定插入該數(shù)組的不同對(duì)象類型。此方法可以指示XmlSerializer將多個(gè)對(duì)象類型的對(duì)象插入同一序列化的數(shù)組中。此時(shí),需要確保每種指定類型與該數(shù)組的類型相同,或與使用XmlArrayItemAttribute的集合的類型相同,或與從該集合派生的類型相同。續(xù)表:使用XML序列化屬性

控制生成的XML(續(xù)).2 使用XML序列化屬性控制生成的XMLXmlAttributeAttributeXmlAttributeAttribute指定XmlSerializer將類成員序列化為XML屬性??蓪mlAttributeAttribute只賦給那些返回值或值數(shù)組(可映射為一種XSD類型)的公共字段或公共屬性。XmlChoiceIdentifierAttributeXmlChoiceIdentifierAttribute指定通過使用枚舉可以進(jìn)一步檢測(cè)成員。這可允許建立一個(gè)序列化為一組選擇(例如列表)的對(duì)象。XMLChoiceIdentifier允許指定選擇在該列表中所選擇的項(xiàng)。XmlChoiceIdentifierAttribute允許將某個(gè)特定枚舉值賦給每個(gè)成員實(shí)例。用戶可自行創(chuàng)建枚舉,也可通過使用XML架構(gòu)定義工具(Xsd.exe)來生成枚舉。使用XML序列化屬性

控制生成的XML(續(xù))續(xù)表:7.2.2 使用XML序列化屬性XmlAttribute7.2.2 使用XML序列化屬性控制生成的XMLXmlElementAttribute當(dāng)XmlSerializer序列化或反序列化包含某個(gè)XML元素的對(duì)象時(shí),XmlElementAttribute指定一個(gè)表示該XML元素的公共字段或?qū)傩?。可將XmlElementAttribute應(yīng)用于公共字段或公共讀/寫屬性,以控制XML元素(例如元素名稱或命名空間)的特性。XmlEnumAttributeXmlEnumAttribute控制XmlSerializer類序列化枚舉成員的過程??墒褂肵mlEnumAttribute分別更改序列化期間XmlSerializer生成枚舉成員的方法或反序列化期間XmlSerializer識(shí)別枚舉成員的方法。例如,假設(shè)有一個(gè)枚舉,它表示一組數(shù),其中包含名為One的首成員。在序列化成員One后,你希望XML中的輸出為Uno,而非One。這可通過以下方式來實(shí)現(xiàn):將XmlEnumAttribute應(yīng)用于該枚舉成員,然后將Name屬性設(shè)置為Uno。XmlIgnoreAttributeXmlIgnoreAttribute指示XmlSerializer類的Serialize方法不要序列化公共字段或公共讀/寫屬性值。如果將XmlIgnoreAttribute應(yīng)用于任何類成員,則當(dāng)序列化或反序列化類的實(shí)例時(shí)XmlSerializer類將忽略該成員。使用XML序列化屬性

控制生成的XML(續(xù))續(xù)表:7.2.2 使用XML序列化屬性XmlElementAt7.2.2 使用XML序列化屬性控制生成的XMLXmlIncludeAttribute當(dāng)XmlSerializer類序列化或反序列化對(duì)象時(shí),XmlIncludeAttribute允許該類識(shí)別特定類型。該類型可以是為序列化而定義的任何派生類。當(dāng)應(yīng)用XmlIncludeAttribute時(shí),需要指定該派生類的類型。在序列化包含基類和派生類的對(duì)象的過程中,XmlSerializer類可以識(shí)別這兩種對(duì)象類型。XmlRootAttributeXmlRootAttribute控制作為XML根元素的屬性對(duì)象的XML序列化。XmlRootAttribute可應(yīng)用于類、結(jié)構(gòu)、枚舉或接口。每個(gè)XML文檔都擁有一個(gè)根元素,它包含所有其他元素。XmlRootAttribute允許通過設(shè)置XmlSerializer類的屬性以控制根元素的生成。這有助于更好地控制文檔的輸出以及其所包含的XML。使用XML序列化屬性

控制生成的XML(續(xù))續(xù)表:7.2.2 使用XML序列化屬性XmlIncludeAt7.2.2 使用XML序列化屬性控制生成的XMLXmlTextAttribute在對(duì)象的序列化或反序列化過程中,XmlTextAttribute指示XmlSerializer應(yīng)將指定成員作為XML文本處理。XmlSerializer將該成員的值轉(zhuǎn)換為XML文本,并將該值編碼為XML元素的內(nèi)容。在一個(gè)類中只可申請(qǐng)一個(gè)XmlTextAttribute的實(shí)例。該屬性允許一個(gè)基于該相應(yīng)類的字符串輸出。由于這個(gè)原因,需要對(duì)每個(gè)類的XmlTextAtttribute的實(shí)例做出限制。XmlTypeAttributeXmlTypeAttribute控制當(dāng)通過XmlSerializer類序列化屬性對(duì)象時(shí),所生成的XML架構(gòu)。XmlTypeAttribute可應(yīng)用于類、結(jié)構(gòu)、枚舉或接口聲明。XmlTypeAttribute指定XML類型的名稱和命名空間。可以將該屬性與XSD.exe工具一起使用以生成一個(gè)XSD文件。使用XML序列化屬性

控制生成的XML(續(xù))續(xù)表:7.2.2 使用XML序列化屬性XmlTextAttriSOAP格式的屬性:7.2.2 使用XML序列化屬性控制生成的XML屬性描述SoapAttributeAttributeSoapAttributeAttribute屬性規(guī)定,XmlSerializer類應(yīng)將類成員序列化為已編碼的SOAP屬性。SoapAttributeAttribute應(yīng)用于公共字段,以指定XmlSerializer類將該字段序列化為XML屬性。對(duì)能夠接受適當(dāng)輸入的SOAP對(duì)象而言,這是很有用的。另外,這也允許使用一個(gè)屬性來序列化Customer對(duì)象,例如使用Preferred屬性將SoapAttribute設(shè)置為Preferred并序列化該對(duì)象。SoapElementAttributeSoapElementAttribute規(guī)定公共成員值可由XmlSerializer類序列化為已編碼的SOAPXML元素。SoapElementAttribute應(yīng)用于公共字段,以指示XmlSerializer將該字段序列化為已編碼的SOAPXML元素。SoapEnumAttributeSoapEnumAttribute控制XmlSerializer序列化枚舉成員的過程。可以使用SoapEnumAttribute來更改在序列化期間XmlSerializer生成枚舉成員的方法或在反序列化期間XmlSerializer識(shí)別枚舉成員的方法。例如,假設(shè)有一個(gè)枚舉,它表示一組數(shù),其中包含名為State的首成員。當(dāng)序列化該成員時(shí),需要讓XML中的輸出為Region,而非State。通過將SoapEnumAttribute應(yīng)用于該枚舉成員,然后將Name屬性設(shè)置為Region,可以實(shí)現(xiàn)這一點(diǎn)。使用XML序列化屬性

控制生成的XML(續(xù))SOAP格式的屬性:7.2.2 使用XML序列化屬性7.2.2 使用XML序列化屬性控制生成的XMLSoapIgnoreAttributeSoapIgnoreAttribute可應(yīng)用于任何在序列化類的實(shí)例時(shí)希望XmlSerializer忽略的類成員。SoapIgnoreAttribute指示XmlSerializer類不要序列化公共字段或公共讀/寫屬性值。SoapIncludeAttributeSoapIncludeAttribute允許在XmlSerializer將對(duì)象序列化或反序列化為已編碼的SOAPXML時(shí)識(shí)別指定類型。當(dāng)應(yīng)用SoapIncludeAttribute時(shí),指定派生類的Type。在序列化包括基類和派生類的對(duì)象的過程中,XmlSerializer可以識(shí)別這兩種對(duì)象類型。SoapTypeAttribute當(dāng)類實(shí)例序列化為SOAP格式的XML時(shí),SoapTypeAttribute控制XmlSerializer生成的架構(gòu)。SoapTypeAttribute只能應(yīng)用于類的聲明。這允許該屬性控制所有類成員的SoapType,以實(shí)現(xiàn)一致性。使用此SoapTypeAttribute集合,所有成員(例如Customer類的FirstName、LastName以及PhoneNumber)將擁有與Customer類相同的SoapTypeAttribute。代碼示例VB使用XML序列化屬性

控制生成的XML(續(xù))續(xù)表:7.2.2 使用XML序列化屬性SoapIgnoreAt生成序列化的二進(jìn)制格式和SOAP格式生成序列化的XML格式創(chuàng)建自定義序列化類

小結(jié)實(shí)驗(yàn)習(xí)題第7章數(shù)據(jù)的序列化生成序列化的二進(jìn)制格式和SOAP格式第7章數(shù)據(jù)的序使用序列化類型收集序列化信息使用序列化接口創(chuàng)建自定義類使用格式化程序類將數(shù)據(jù)轉(zhuǎn)換為序列化格式使用事件處理程序?qū)傩蕴幚硇蛄谢录褂肙bjectManager類管理反序列化的對(duì)象.創(chuàng)建自定義序列化類7.3 創(chuàng)建自定義序列化類使用序列化類型收集序列化信息.創(chuàng)建自定義序列化類7.3 SerializationEntry結(jié)構(gòu)SerializationInfo類使用序列化類型

收集序列化信息7.3.1 使用序列化類型收集序列化信息當(dāng)使用對(duì)象時(shí),需要以某種格式實(shí)現(xiàn)序列化,從而將信息保存到該對(duì)象或?qū)⒃搶?duì)象轉(zhuǎn)移到另一個(gè)進(jìn)程中。StreamingContext結(jié)構(gòu)SerializationEntry結(jié)構(gòu)SerializSerializationEntry結(jié)構(gòu)1. SerializationEntry結(jié)構(gòu)SerializationEntry結(jié)構(gòu)包含Name、ObjectType以及Value屬性,分別用來檢索序列化的對(duì)象的名稱、類型以及值。因此,當(dāng)序列化對(duì)象時(shí),通過使用該結(jié)構(gòu)可以傳遞反序列化所必需的信息。成員描述NameName屬性獲取對(duì)象的名稱。ObjectTypeObjectType屬性獲取對(duì)象的Type。如果序列化的對(duì)象為一個(gè)空引用,則該屬性將返回Object類型。ValueValue屬性獲取序列化的對(duì)象中包含的值。代碼示例C#代碼示例VBSerializationEntry結(jié)構(gòu)1. SeriaSerializationInfo類的成員SerializationInfo類2. SerializationInfo類成員描述AssemblyNameAssemblyName屬性獲取或設(shè)置序列化期間要序列化的類型的程序集名稱。該程序集名稱包含程序集名稱、版本、文化以及關(guān)于該對(duì)象的安全性信息。文化表示特定文化的信息,例如該文化的名稱、語言和區(qū)域。安全性信息可以是用戶上下文、代碼上下文或代理設(shè)置。FullTypeNameFullTypeName屬性獲取或設(shè)置要序列化的Type全名。FullTypeName是該類型的完全限定名稱,包含相應(yīng)的命名空間。當(dāng)序列化此對(duì)象的類型信息時(shí),格式化程序會(huì)使用此名稱。MemberCountMemberCount屬性獲取添加到SerializationInfo類存儲(chǔ)的成員的數(shù)目。SerializationInfo類的成員Seriali續(xù)表2. SerializationInfo類GetValueGetValue方法從基于指定的名稱和類型的SerializationInfo類中檢索一個(gè)值。當(dāng)存儲(chǔ)在SerializationInfo類中的數(shù)據(jù)與請(qǐng)求的類型匹配時(shí),該方法將返回與該名稱直接關(guān)聯(lián)的值。例如,如果存儲(chǔ)與名稱Age相關(guān)聯(lián)的值42,則當(dāng)檢索Age時(shí),將獲取值42作為答案。如果返回值與請(qǐng)求的類型不相符,則調(diào)用IFormatterConverter.Convert以將其轉(zhuǎn)換為適當(dāng)?shù)念愋?。IFormatterConverter接口在SerializationInfo的實(shí)例與最適合解析SerializationInfo類中的數(shù)據(jù)的格式化程序提供的類之間提供了一個(gè)連接。IFormatterConverter接口屬于System.Runtime.Serialization命名空間。AddValueAddValue方法將有助于向SerializationInfo類中添加一個(gè)值。AddValue方法擁有多個(gè)重載形式,例如SerializationInfo.AddValue(String,DateTime)、SerializationInfo.AddValue(String,Int32)及SerializationInfo.AddValue(String,Boolean)。在所有這些重載形式中,AddValue方法接受了一個(gè)“名稱/值”對(duì),其中值表示要添加的實(shí)際值,而名稱表示要與相應(yīng)值關(guān)聯(lián)的名稱。反序列化對(duì)象時(shí),可以使用該名稱從SerializationInfo存取區(qū)中檢索相關(guān)聯(lián)的值。GetTypeGetType方法獲取當(dāng)前SerializationInfo實(shí)例的Type。這是一個(gè)從泛型Object類型繼承來的方法(可以為所有對(duì)象定義此方法)。如果不能加載該類型,則這個(gè)方法將返回一個(gè)空引用。僅當(dāng)在內(nèi)存中找不到該類型和類型不能加載到內(nèi)存中時(shí)才會(huì)發(fā)生空引用。SetTypeSetType方法設(shè)置要序列化的對(duì)象的Type。使用SetType方法與設(shè)置FullTypeName和AssemblyName是等效的。代碼示例C#代碼示例VB續(xù)表:續(xù)表2. SerializationInfo類GetValStreamingContext結(jié)構(gòu)3. StreamingContext結(jié)構(gòu)成員描述StateState屬性獲取傳輸數(shù)據(jù)的源或目標(biāo)。它是一個(gè)只讀屬性。在序列化期間,該屬性指定傳輸數(shù)據(jù)的目標(biāo)。在反序列化期間,該屬性指出反序列化流的源。State屬性接受枚舉值,StreamingContextStates,該值提供關(guān)于所發(fā)生的序列化類型的信息。StreamingContextStates枚舉擁有下列成員:All:該成員指定可向任何上下文傳輸或從任何上下文接收序列化的數(shù)據(jù)。Clone:該成員指定正在克隆對(duì)象圖而不影響原始對(duì)象。在這種情形下,可以假定克隆圖將繼續(xù)與原始對(duì)象圖在同一進(jìn)程中存在。CrossAppDomain:該成員指定序列化數(shù)據(jù)的源或目標(biāo)上下文是另一個(gè)應(yīng)用程序域。CrossMachine:該成員指定序列化數(shù)據(jù)的源或目標(biāo)上下文是另一臺(tái)計(jì)算機(jī)。CrossProcess:該成員指定序列化數(shù)據(jù)的源或目標(biāo)上下文是同一計(jì)算機(jī)上的另一個(gè)進(jìn)程。File:該成員指定序列化數(shù)據(jù)的源或目標(biāo)是一個(gè)文件。Other:該成員指定序列化上下文未知,這意味著其上下文狀態(tài)不是其他可能的上下文狀態(tài)(例如File、Remoting或CrossMachine)中的任何一個(gè)??梢允褂迷摮蓡T覆蓋開發(fā)期間可能引發(fā)的意外情況。Persistence:該成員指定序列化數(shù)據(jù)的源或目標(biāo)上下文是永久的存儲(chǔ)區(qū),例如數(shù)據(jù)庫、文件或其他后備存儲(chǔ)區(qū)。Remoting:該成員指定序列化的數(shù)據(jù)用于一個(gè)遠(yuǎn)程上下文中,該遠(yuǎn)程上下文可為未知位置中的另一臺(tái)計(jì)算機(jī)。CrossAppDomain、CrossMachine、CrossProcess和File成員將覆蓋一個(gè)在分布式環(huán)境(可以跨應(yīng)用程序域、進(jìn)程、文件或計(jì)算機(jī))中共享數(shù)據(jù)的應(yīng)用程序。這將在分布式環(huán)境中啟用應(yīng)用程序縮放功能。ContextContext屬性獲取指定作為調(diào)用方定義的附加上下文一部分的上下文。使用該屬性,可以將任何用戶定義的值傳遞給StreamingContext結(jié)構(gòu)。該屬性是一個(gè)只讀屬性并可以返回一個(gè)空引用。代碼示例C#代碼示例VBStreamingContext結(jié)構(gòu)3. StreamiISerializableIDeserializationCallbackIFormatterIFormatterConverter使用序列化接口

創(chuàng)建自定義類7.3.2 使用序列化接口創(chuàng)建自定義類.NETFramework提供了序列化接口,這些接口由啟用序列化功能的所有內(nèi)置類來實(shí)現(xiàn)。代碼示例C#代碼示例VBISerializable使用序列化接口

創(chuàng)建自定義類7Formatter類

FormatterConverter類

FormatterServices類

使用格式化程序類將

數(shù)據(jù)轉(zhuǎn)換為序列化格式7.3.3 使用格式化程序類將數(shù)據(jù)轉(zhuǎn)換為序列化格式.NETFramework提供了三種格式化程序類:Formatter類使用格式化程序類將

數(shù)據(jù)轉(zhuǎn)換為序列事件處理程序?qū)傩允褂檬录幚沓绦?/p>

屬性處理序列化事件7.3.4 使用事件處理程序?qū)傩蕴幚硇蛄谢录录幚沓绦驅(qū)傩悦枋鯫nSerializingAttribute

當(dāng)應(yīng)用于類中的某個(gè)特定方法時(shí),該屬性指定在對(duì)象序列化之前執(zhí)行該方法。OnSerializedAttribute

當(dāng)應(yīng)用于某個(gè)方法時(shí),該屬性指定在對(duì)象序列化之后必須執(zhí)行該方法。事件處理程序?qū)傩允褂檬录幚沓绦?/p>

屬性處理序列化事件7.使用事件處理程序

屬性處理序列化事件(續(xù))7.3.4 使用事件處理程序?qū)傩蕴幚硇蛄谢录﨩nDeserializingAttribute

當(dāng)應(yīng)用于類中的某個(gè)特定方法時(shí),該屬性指定恰好在對(duì)相應(yīng)類的對(duì)象進(jìn)行反序列化之前必須執(zhí)行的方法。OnDeserializedAttribute

當(dāng)應(yīng)用于類中的某個(gè)特定方法時(shí),該屬性指定在對(duì)相應(yīng)類的對(duì)象進(jìn)行反序列化之后必須執(zhí)行的方法。OptionalFieldAttribute

該屬性可將類的成員標(biāo)記為可選的。這啟用了為序列化數(shù)據(jù)的應(yīng)用程序的舊版本而創(chuàng)建的多種類型的版本兼容序列化。在大多數(shù)情況下,反序列化期間,如果在相應(yīng)的序列化流中沒有找到某種類型的成員,則運(yùn)行時(shí)將生成一個(gè)異常。如果被序列化的某種類型在其后續(xù)版本中添加成員,而該序列化流只表示舊版本的一個(gè)對(duì)象,則就會(huì)引發(fā)此種情形。如果為新成員指定該屬性,則它可正常處理舊數(shù)據(jù),而格式化程序不會(huì)引發(fā)任何異常。該屬性的優(yōu)點(diǎn)在于允許靈活修改要被序列化或反序列化的類。續(xù)表:使用事件處理程序

屬性處理序列化事件(續(xù))7.3.4 使用ObjectManager類的常用方法使用ObjectManager類

管理反序列化的對(duì)象7.3.5 使用ObjectManager類管理反序列化的對(duì)象方法描述DoFixupsDoFixups方法執(zhí)行所有記錄的修正。這些修正由任何在System.Serializable中定義的合適的代理來執(zhí)行,或者是對(duì)象本身(如果它實(shí)現(xiàn)ISerializable),或者是默認(rèn)代理(在System.Serializable中定義)。GetObjectGetObject方法用于檢索一個(gè)使用相應(yīng)ObjectManager實(shí)例注冊(cè)的對(duì)象,該實(shí)例基于一個(gè)指定為該方法的參數(shù)的對(duì)象ID。如果尚未使用指定ID注冊(cè)這樣的對(duì)象,則該方法返回null。代碼示例C#代碼示例VBObjectManager類的常用方法使用ObjectMa使用ObjectManager類

管理反序列化的對(duì)象(續(xù))7.3.5 使用ObjectManager類管理反序列化的對(duì)象RaiseDeserializationEventRaiseDeserializationEvent方法對(duì)任何實(shí)現(xiàn)IDeserializationCallback的注冊(cè)對(duì)象引發(fā)反序列化事件。IDeserializationCallback接口將通知反序列化對(duì)象的時(shí)間。RecordArrayElementFixupRecordArrayElementFixup方法記錄數(shù)組中一個(gè)元素的修正,以便在稍后執(zhí)行。該方法擁有兩個(gè)簽名:RecordArrayElementFixup(Int64,Int32,Int64):在此簽名中,修正是針對(duì)特定數(shù)組的特定元素,且修正進(jìn)程期間所使用的值由objectRequired參數(shù)提供。RecordArrayElementFixup(Int64,Int32[],Int64):在此簽名中,修正是針對(duì)特定數(shù)組的所有元素,且修正進(jìn)程期間所使用的值由objectRequired參數(shù)提供。此方法與前一方法的惟一不同之處在于:此方法傳遞一個(gè)整數(shù)數(shù)組,而前一方法傳遞單個(gè)整數(shù)值。續(xù)表:使用ObjectManager類

管理反序列化的對(duì)象(續(xù))使用ObjectManager類

管理反序列化的對(duì)象(續(xù))7.3.5 使用ObjectManager類管理反序列化的對(duì)象RecordDelayedFixupRecordDelayedFixup方法記錄對(duì)象成員的修正,以便在稍后執(zhí)行。該方法使用三個(gè)參數(shù):objectToBeFixed:指示要修正的對(duì)象的ID。memberName:一個(gè)將在其中執(zhí)行修正的objectToBeFixed的字符串。objectRequired:指示所需對(duì)象的ID。修正是針對(duì)特定對(duì)象的特定成員,且將修正進(jìn)程期間所使用的值提供為objectRequired參數(shù)。RecordFixupRecordFixup方法記錄對(duì)象成員的修正,以便在稍后執(zhí)行。該方法使用三個(gè)參數(shù):objectToBeFixed:指示需要objectRequired對(duì)象引用的對(duì)象ID。Member:指示將在其中執(zhí)行修正的objectToBeFixed的成員。objectRequired:指示objectToBeFixed所需對(duì)象的ID。修正是針對(duì)特定對(duì)象的特定成員,且將修正進(jìn)程期間所使用的值提供為objectRequired參數(shù)。雖然RecordDelayedFixup方法和RecordFixup方法都執(zhí)行相同的任務(wù),但是它們的參數(shù)列表是不同的。RecordFixup方法接受要執(zhí)行修正的成員作為MemberInfo類的一個(gè)對(duì)象,而RecordDelayedFixup接受該成員的名稱作為一個(gè)字符串,而非MemberInfo對(duì)象。續(xù)表:使用ObjectManager類

管理反序列化的對(duì)象(續(xù)使用ObjectManager類

管理反序列化的對(duì)象(續(xù))7.3.5 使用ObjectManager類管理反序列化的對(duì)象RegisterObjectRegisterObject方法在對(duì)象反序列化時(shí)使用ObjectManager注冊(cè)該對(duì)象。該方法擁有四個(gè)簽名:RegisterObjectMethod(Object,Int64):該方法在對(duì)象反序列化時(shí)注冊(cè)該對(duì)象,并使其與objected關(guān)聯(lián)。RegisterObjectMethod(Object,Int64,SerializationInfo):該方法在對(duì)象反序列化時(shí)注冊(cè)該對(duì)象,使其與objected關(guān)聯(lián),并記錄其所使用的SerializationInfo。如果該對(duì)象執(zhí)行ISerializable或擁有一個(gè)ISerializationSurrogate,則會(huì)使用SerializationInfo。RegisterObjectMethod(Object,Int64,SerializationInfo,Int64,MemberInfo):該方法在對(duì)象反序列化時(shí)注冊(cè)該對(duì)象的成員,使該對(duì)象與objectID關(guān)聯(lián),并記錄SerializationInfo。只有當(dāng)該對(duì)象為ValueType時(shí),MemberInfo參數(shù)才發(fā)揮作用,這是因?yàn)榇鎯?chǔ)ValueType的信息的空間是與其所包含的對(duì)象一起內(nèi)聯(lián)分配的。RegisterObjectMethod(Object,Int64,SerializationInfo,Int64,MemberInfo,Int32[]):該方法在對(duì)象反序列化時(shí)注冊(cè)該對(duì)象中所包含的數(shù)組的成員。如果該對(duì)象既是ValueType又是數(shù)組的成員,則arrayIndex參數(shù)將包含該對(duì)象在該數(shù)組中的索引。如果該對(duì)象既不是ValueType又不是數(shù)組的成員,則忽略arrayIndex。續(xù)表:使用ObjectManager類

管理反序列化的對(duì)象(續(xù)生成序列化的二進(jìn)制格式和SOAP格式生成序列化的XML格式創(chuàng)建自定義序列化類

小結(jié)實(shí)驗(yàn)習(xí)題第7章數(shù)據(jù)的序列化生成序列化的二進(jìn)制格式和SOAP格式第7章數(shù)據(jù)的序7.4 小結(jié)本章學(xué)習(xí)了數(shù)據(jù)的序列化。在.NETFramework中,對(duì)象可以使用多種格式序列化。常用的格式有二進(jìn)制格式和Soap格式。BinaryFormatter類和SoapFormatter類提供了對(duì)應(yīng)的功能。還可以使用XmlSerializer類和序列化屬性將對(duì)象序列化為XML格式。小結(jié)7.4 小結(jié)本章學(xué)習(xí)了數(shù)據(jù)的序列化。在.NETFramew生成序列化的二進(jìn)制格式和SOAP格式生成序列化的XML格式創(chuàng)建自定義序列化類

小結(jié)實(shí)驗(yàn)習(xí)題第7章數(shù)據(jù)的序列化生成序列化的二進(jìn)制格式和SOAP格式第7章數(shù)據(jù)的序?qū)嶒?yàn)7.5 實(shí)驗(yàn)參照實(shí)驗(yàn)手冊(cè),并在教師指導(dǎo)下完成實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)7.5 實(shí)驗(yàn)參照實(shí)驗(yàn)手冊(cè),并在教師指導(dǎo)下完成實(shí)驗(yàn)報(bào)告。生成序列化的二進(jìn)制格式和SOAP格式生成序列化的XML格式創(chuàng)建自定義序列化類

小結(jié)實(shí)驗(yàn)習(xí)題第7章數(shù)據(jù)的序列化生成序列化的二進(jìn)制格式和SOAP格式第7章數(shù)據(jù)的序習(xí)題7.6 習(xí)題1. 在應(yīng)用程序中你使用lSerializer以將對(duì)象序列化到硬盤上的一個(gè)XML文件中。作為默認(rèn)行為,XmlSerializer將對(duì)象中所提供的多個(gè)公共成員序列化為該XML文件中的元素。要以一種更好的結(jié)構(gòu)格式來安排該XML文件中的數(shù)據(jù),則需要將某些成員序列化為屬性,而將其他數(shù)組類型的成員序列化為序列化的數(shù)組。此外,你想用該XML文件中的一些自定義名稱來表示這些成員,而不是用對(duì)該類中的這些成員定義時(shí)所使用的名稱。以下哪種功能將幫助你實(shí)現(xiàn)以上要求?請(qǐng)選擇所有符合條件的答案。A.IXmlSerializable接口B.XML序列化屬性C.XML序列化委托D.XML架構(gòu)習(xí)題7.6 習(xí)題1. 在應(yīng)用程序中你使用lSerializ習(xí)題(續(xù))2. 你已創(chuàng)建一個(gè)分布式應(yīng)用程序,它允許客戶登錄到信息銷售系統(tǒng)并提供信息。這些信息可以同時(shí)從幾個(gè)位置收集,你需要確定客戶及其相關(guān)信息。.NETFramework序列化體系結(jié)構(gòu)提供了三種序列化類型,用來指定以序列化格式表示對(duì)象所需要的某些值,并在反序列化期間相應(yīng)地檢索這些值。你需要提供關(guān)于某個(gè)特定序列化流的源和目標(biāo)的信息。你將選擇以下哪種方法?請(qǐng)選擇所有符合條件的答案。A.Serialize方法B.SerializationEntry結(jié)構(gòu)C.SerializationInfo類D.StreamingContext結(jié)構(gòu)7.6 習(xí)題習(xí)題(續(xù))2. 你已創(chuàng)建一個(gè)分布式應(yīng)用程序,它允許客戶登錄到習(xí)題(續(xù))3. 你通過使用VisualStudio.NET創(chuàng)建了一個(gè)應(yīng)用程序,它幫助你為人力資源部門收集幾條關(guān)鍵雇員數(shù)據(jù)。這些信息必須從面試、工作申請(qǐng)、簡(jiǎn)歷以及必須填寫的雇員表格中收集。這里存在一個(gè)處理要收集數(shù)據(jù)的順序。在收集完這些信息后,將其序列化并存儲(chǔ)以供人力資源部門進(jìn)一步處理。.NETFramework并未提供預(yù)定義規(guī)則,用以管理對(duì)象的反序列化順序/序列。如果對(duì)象之間存在依賴關(guān)系或者需要序列化的對(duì)象的順序關(guān)系很重要,則你需要注意該對(duì)象完全被反序列化的時(shí)間。下列哪種接口將幫助你實(shí)現(xiàn)此功能?請(qǐng)選擇所有符合條件的答案。A.IDeserializationCallbackB.ISerializableC.IFormatterD.IFormatterConverter7.6 習(xí)題習(xí)題(續(xù))3. 你通過使用VisualStudio.NE第7章 數(shù)據(jù)的序列化第7章 數(shù)據(jù)的序列化.NETFramework2.0程序設(shè)計(jì)第1章:.NETFramework2.0簡(jiǎn)介

第2章:公共語言運(yùn)行庫和類型第3章:托管代碼的編譯和執(zhí)行第4章:委托和事件第5章:讀取和寫入文件第6章:集合和泛型第7章:數(shù)據(jù)的序列化

第8章:GDI+第9章:在.NETFramework2.0中實(shí)現(xiàn)加密第10章:COM組件與.NETFramework程序集之間的交互操作第11章:使用類型元數(shù)據(jù)第12章:創(chuàng)建多線程應(yīng)用程序和應(yīng)用程序域第13章:代碼訪問安全性第14章:監(jiān)視和調(diào)試應(yīng)用程序第15章:使用服務(wù)應(yīng)用程序和電子郵件消息第16章:創(chuàng)建全球化應(yīng)用程序第17章:配置和安裝程序集.NETFramework2.0程序設(shè)計(jì)第1章:本章學(xué)習(xí)目標(biāo):通過BinaryFormatter類和SoapFormatter類,將對(duì)象序列化為二進(jìn)制格式和SOAP格式

通過XmlSerializer類、IXmlSerializable接口及XML序列化屬性和委托,將對(duì)象序列化為自定義XML格式創(chuàng)建自定義序列化類

目標(biāo)本章學(xué)習(xí)目標(biāo):目標(biāo)生成序列化的二進(jìn)制格式和SOAP格式生成序列化的XML格式創(chuàng)建自定義序列化類

小結(jié)實(shí)驗(yàn)習(xí)題第7章數(shù)據(jù)的序列化生成序列化的二進(jìn)制格式和SOAP格式第7章數(shù)據(jù)的序生成序列化的二進(jìn)制

格式和SOAP格式7.1 生成序列化的二進(jìn)制格式和SOAP格式對(duì)象數(shù)據(jù)的傳輸序列化和反序列化代碼示例VB生成序列化的二進(jìn)制

格式和SOAP格式7.1 生成序列.BinaryFormatter類的成員BinaryFormatter類的成員7.1.1 BinaryFormatter類的成員成員描述AssemblyFormat屬性AssemblyFormat屬性定義或返回用于序列化程序集名稱的程序集格式。該返回值取決于FormatterAssemblyStyle枚舉(擁有兩個(gè)成員:Full和Simple)的值。在程序集格式為Full的情況下,程序集描述包括程序集名稱、所保存的對(duì)象的全球文化以及程序集的版本和公鑰標(biāo)志。在程序集格式為Simple的情況下,程序集描述僅由程序集名稱組成。Binder屬性Binder屬性定義或返回一個(gè)SerializationBinder類的對(duì)象,該對(duì)象用于控制將序列化對(duì)象綁定到類型的過程。這里,類型是指在序列化過程中用于加載序列化對(duì)象的自定義類型,而非該序列化對(duì)象的實(shí)際類型。在對(duì)象被反序列化時(shí),這將有助于你選擇所要的對(duì)象類型。例如,雇員信息原來以Employee類型進(jìn)行保存,稍后,由于雇員要從公司商店購買一些產(chǎn)品,所以要序列化該雇員信息。因此,你需要將該雇員信息以Customer類型進(jìn)行反序列化。通過SerializationBinder類可加載自定義類型,以替代由序列化引擎執(zhí)行的默認(rèn)加載,這意味著可以更改序列化對(duì)象的默認(rèn)行為。另外,還可以通過使用SerializationBinder來檢查應(yīng)用程序域中加載的類型。這將有助于維護(hù)包含拒絕類型的黑名單和允許類型的白名單,并限制被加載和實(shí)例化的類型。.BinaryFormatter類的成員BinaryFor.BinaryFormatter類的成員(續(xù))7.1.1 BinaryFormatter類的成員Context屬性Context屬性定義或返回BinaryFormatter的StreamingContext。StreamingContext結(jié)構(gòu)指示格式化程序所使用的位的源或目標(biāo)。FilterLevel屬性FilterLevel屬性定義或返回BinaryFormatter所執(zhí)行的自動(dòng)反序列化的TypeFilterLevel枚舉類型的值。該值取決于TypeFilterLevel枚舉所指定的值,可為Low或Full。Low反序列化級(jí)別是.NETFramework中的默認(rèn)值。它僅對(duì)與最基本的遠(yuǎn)程處理功能相關(guān)聯(lián)的類型進(jìn)行反序列化,從而抵御反序列化攻擊。反序列化攻擊允許未授權(quán)用戶攔截消息,并讀取或更改該消息中的信息。Low反序列化級(jí)別支持的類型有:遠(yuǎn)程處理基礎(chǔ)結(jié)構(gòu)對(duì)象、基元類型、引用類型以及值類型。Full反序列化級(jí)別支持對(duì)所有這些類型的自動(dòng)反序列化,即在任何情況下受遠(yuǎn)程處理支持的類型。續(xù)表:.BinaryFormatter類的7.1.1 Binary.SurrogateSelector屬性SurrogateSelector屬性定義或返回ISurrogateSelector接口,以控制序列化和反序列化過程中的類型替換。ISurrogateSelector接口屬于System.Runtime.Serialization命名空間。使用SurrogateSelector屬性,未標(biāo)記為可序列化的對(duì)象也可被序列化。假設(shè)一個(gè)示例,其中你創(chuàng)建一個(gè)Customer類型的對(duì)象,但是不能將其標(biāo)記為Serializable。因此,你創(chuàng)建一個(gè)ISurrogateSelector接口的類型,并將SurrogateSelector屬性設(shè)置為該類型的對(duì)象,以將Customer類型指向到已標(biāo)記為可序列化的Person類型。這允許序列化對(duì)象的Customer類型。TypeFormat屬性TypeFormat屬性定義或返回類型說明在序列化流中的布局格式。該屬性接收一個(gè)FormatterTypeStyle枚舉類型的值,該枚舉類型擁有以下成員:TypesAlways:指示可為所有對(duì)象和ISerializable對(duì)象成員提供類型。TypesWhenNeeded:指示只能為對(duì)象數(shù)組、Object類型的對(duì)象成員以及ISerializable非基元值類型(例如結(jié)構(gòu)和枚舉)聲明類型。XsdString:指示可以XSD格式(而非SOAP格式)提供字符串。7.1.1 BinaryFormatter類的成員續(xù)表續(xù)表:.SurrogateSelector屬性Surrogate.DeSerialize方法DeSerialize方法將指定的流反序列化為對(duì)象圖。如果反序列化成功,則該流中的當(dāng)前位置必須位于對(duì)象圖的開頭。該方法將返回該對(duì)象圖的頂級(jí)對(duì)象。Deserialize方法擁有兩種重載形式:BinaryFormatter.Deserialize(Stream):此形式將指定的流反序列化為對(duì)象圖。BinaryFormatter.Deserialize(Stream,HeaderHandler):此形式也將指定的流反序列化為對(duì)象圖。另外,此形式中提供的HeaderHandler參數(shù)將處理該流中的所有標(biāo)題對(duì)象。標(biāo)題對(duì)象傳達(dá)關(guān)于遠(yuǎn)程函數(shù)調(diào)用的信息。標(biāo)題對(duì)象的一些例子包括事務(wù)ID或方法簽名。如果創(chuàng)建HeaderHandler,則需要確定要處理該事件的方法。Serialize方法Serialize方法將對(duì)象或具有指定頭的對(duì)象圖序列化為給定的流。Serialize方法擁有以下兩種重載形式:BinaryFormatter.Serialize(Stream,Object):此形式將對(duì)象或具有指定頭的對(duì)象圖序列化為給定的流。BinaryFormatter.Serialize(Stream,Object,Header[]):此形式通過附加所提供的標(biāo)題,也將對(duì)象或具有指定頭的對(duì)象圖序列化為給定的流。所包括的標(biāo)題將有助于傳輸關(guān)于消息如何處理的信息。序列化進(jìn)程包含序列化流的開始處的標(biāo)題參數(shù)所提供的信息。7.1.1 BinaryFormatter類的成員續(xù)表續(xù)表:.DeSerialize方法DeSerialize方法將.SoapFormatter類的成員SoapFormatter類的成員7.1.2 SoapFormatter類的成員成員描述AssemblyFormat屬性AssemblyFormat屬性定義或返回用于序列化程序集名稱的格式。此屬性使用在生成的SOAP信息中程序集引用的FormatterAssemblyStyle枚舉格式。當(dāng)反序列化一個(gè)對(duì)象時(shí),這些引用可用于定位程序集。該屬性只應(yīng)用于消息的格式,而不應(yīng)用于序列化對(duì)象的格式,這是由于序列化對(duì)象的格式是通過選擇BinaryFormatter或SoapFormatter來控制的。Binder屬性在SoapFormatter類中關(guān)于此屬性的描述與BinaryFormatte類中的描述相同。.SoapFormatter類的成員SoapFormatt.7.1.2 SoapFormatter類的成員Context屬性Context屬性定義或返回和SoapFormatter一起使用的StreamingContext。StreamingContext包含關(guān)于序列化消息的目標(biāo)的信息,可允許目標(biāo)對(duì)象為其接收的對(duì)象確定正確的上下文。例如,你已從Person類派生了許多類型,且Customer類型即是其中一個(gè)。當(dāng)序列化Person類型的一個(gè)對(duì)象時(shí),你希望該對(duì)象能告知目標(biāo)它是Customer類型。Context屬性被傳遞給處理自己的序列化的對(duì)象。FilterLevel屬性FilterLevel屬性定義或返回自動(dòng)反序列化的TypeFilterLevel枚舉類型的值,以用于.NETFramework遠(yuǎn)程處理。該值取決于TypeFilterLevel枚舉所指定的值,可為Low或Full。該屬性在SoapFormatter中支持的Low和Full反序列化級(jí)別類型和在BinaryFormatter中所支持的相同。SurrogateSelector屬性SurrogateSelector屬性定義或返回ISurrogateSelector類,以控制序列化和反序列化過程中的類型替換。該類屬于System.Runtime.Serialization命名空間。ISurrogateSelector指定一個(gè)替換類型以控制未定義為可序列化的特定類型的序列化過程。序列化代理提供一個(gè)對(duì)象,以處理另一個(gè)對(duì)象的序列化要求,并在必要時(shí)轉(zhuǎn)換序列化數(shù)據(jù)。SoapFormatter類的成員(續(xù))續(xù)表:.7.1.2 SoapFormatter類的成員Contex.7.1.2 SoapFormatter類的成員TopObject屬性TopObject屬性定義或返回ISoapMessage,一個(gè)在傳輸字節(jié)過程中用于發(fā)送和接收的消息類型,其中可反序列化SOAP頂級(jí)對(duì)象。TopObject屬性設(shè)置ISoapMessage以接收具有反序列化RPC(RemoteProcedureCall,遠(yuǎn)程過程調(diào)用)格式的消息中的數(shù)據(jù)。TypeFormat屬性TypeFormat屬性定義或返回類型說明在序列化流中的布局格式。該屬性控制當(dāng)SOAP消息中生成對(duì)象引用標(biāo)識(shí)符時(shí)的格式類型。該屬性接收一個(gè)FormatterTypeStyle枚舉類型的值,該枚舉類型擁有以下成員:TypesAlwaysTypesWhenNeededXsdStringSoapFormatter類的成員(續(xù))續(xù)表:.7.1.2 SoapFormatter類的成員TopObj.續(xù)表:7.1.2 SoapFormatter類的成員DeSerialize方法DeSerialize方法將提供流上的數(shù)據(jù)反序列化,并在接收位置重組對(duì)象圖。SoapFormatter提供了Deserialize方法的下列兩個(gè)版本:Deserialize(Stream):該方法存儲(chǔ)包含要被反序列化的數(shù)據(jù)的流,并返回該反序列化圖形的頂級(jí)對(duì)象。Deserialize(Stream,HeaderHandler):該方法將流反序列化為對(duì)象圖,并由指定的委托來處理流中的任何頭,以對(duì)在流中找到的任何頭對(duì)象進(jìn)行處理。

Serialize方法Serialize方法將對(duì)象或具有指定根

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論