NET中對象序列化方法_第1頁
NET中對象序列化方法_第2頁
NET中對象序列化方法_第3頁
NET中對象序列化方法_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、NET中對象序列化方法         08-07-30 16:46:00     作者:王穎    編輯:studa0714   摘  要  實現(xiàn)序列化最重要的兩個原因是:將對象的狀態(tài)保存在存儲媒體中以便以后重新創(chuàng)建出完全相同的副本;按值將對象從一個應(yīng)用程序域發(fā)送至另一個應(yīng)用程序域。例如,序列化可用于在 ASP.NET 中保存會話狀態(tài);將對象復(fù)制到 Windows 窗體的剪貼板中;它還可用于按值

2、將對象從一個應(yīng)用程序域遠(yuǎn)程傳遞至另一個應(yīng)用程序域。本文簡要介紹了 Microsoft .NET 中使用的序列化。      關(guān)鍵詞  .NET;序列化;封送 1  引言     序列化是指將對象實例的狀態(tài)存儲到存儲媒體的過程。在此過程中,先將對象的公共字段和私有字段以及類的名稱(包括類所在的程序集)轉(zhuǎn)換為字節(jié)流,然后再把字節(jié)流寫入數(shù)據(jù)流。在隨后對對象進(jìn)行反序列化時,將創(chuàng)建出與原對象完全相同的副本。     在面向?qū)ο蟮沫h(huán)境中實現(xiàn)序列化機(jī)制時,必須

3、在易用性和靈活性之間進(jìn)行一些權(quán)衡。只要對此過程有足夠的控制能力,就可以使該過程在很大程度上自動進(jìn)行。例如,簡單的二進(jìn)制序列化不能滿足需要,或者,由于特定原因需要確定類中哪些字段需要序列化。以下各部分將探討 .NET 框架提供的可靠的序列化機(jī)制,并著重介紹如何根據(jù)需要自定義序列化過程。2  持久存儲     我們經(jīng)常需要將對象的字段值保存到磁盤中,并在以后在內(nèi)存中還原次對象。盡管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,并且在需要跟蹤對象的層次結(jié)構(gòu)時,會變得越來越復(fù)雜。可以想象一下編寫包含大量對象的大型業(yè)務(wù)應(yīng)用程序的情形,程

4、序員不得不為每一個對象編寫代碼,以便將字段和屬性保存至磁盤以及從磁盤還原這些字段和屬性。序列化提供了輕松實現(xiàn)這個目標(biāo)的快捷方法。     公共語言運(yùn)行時 (CLR) 管理對象在內(nèi)存中的分布,.NET 框架則通過使用反射提供自動的序列化機(jī)制。對象序列化后,類的名稱、程序集以及類實例的所有數(shù)據(jù)成員均被寫入存儲媒體中。對象通常用成員變量來存儲對其它實例的引用。類序列化后,序列化引擎將跟蹤所有已序列化的引用對象,以確保同一對象不被序列化多次。.NET 框架所提供的序列化體系結(jié)構(gòu)可以自動正確處理對象圖表和循環(huán)引用。對對象圖表的惟一要求是,由正在進(jìn)行序列化的對象所引

5、用的所有對象都必須標(biāo)記為 Serializable。否則,當(dāng)序列化程序試圖序列化未標(biāo)記的對象時將會出現(xiàn)異常。當(dāng)反序列化已序列化的類時,將重新創(chuàng)建該類的對象,并自動還原所有數(shù)據(jù)成員的值。3  按值封送     按值封送是指將對象序列化為字節(jié)流,并從一個應(yīng)用程序域傳輸至另一個應(yīng)用程序域,然后進(jìn)行反序列化,從而在第二個應(yīng)用程序域中產(chǎn)生出該對象的一個副本,這在COM技術(shù)中經(jīng)常提到。在.Net中,對象僅在創(chuàng)建對象的應(yīng)用程序域中有效,除非對象是從 MarshalByRefObject 派生得到或標(biāo)記為 Serializable,否則,任何將對象作為參數(shù)傳遞

6、或作為結(jié)果返回到另外一個應(yīng)用程序域都將失敗。     如果對象標(biāo)記為 Serializable,則該對象將被自動序列化,并從一個應(yīng)用程序域傳輸至另一個應(yīng)用程序域,然后進(jìn)行反序列化,從而在第二個應(yīng)用程序域中產(chǎn)生出該對象的一個精確副本。如果對象是從 MarshalByRefObject 派生得到,則從一個應(yīng)用程序域傳遞至另一個應(yīng)用程序域的是對象引用,而不是對象本身。也可以將從 MarshalByRefObject 派生得到的對象標(biāo)記為 Serializable。遠(yuǎn)程使用此對象時,負(fù)責(zé)進(jìn)行序列化并已預(yù)先配置為 SurrogateSelector 的格式化程序?qū)?/p>

7、控制序列化過程,并用一個代理替換所有從 MarshalByRefObject 派生得到的對象。如果沒有預(yù)先配置為 SurrogateSelector,序列化體系結(jié)構(gòu)將遵從下面的標(biāo)準(zhǔn)序列化規(guī)則。4  基本序列化     要使一個類可序列化,最簡單的方法是使用 Serializable 屬性對它進(jìn)行標(biāo)記,如下所示:Serializablepublic class MyObjectpublic int n1 = 0;public int n2 = 0;public String str = null;以下代碼片段說明了如何將此類的一個實例序列化為一個

8、文件:MyObject obj = new MyObject();obj.n1 = 1;obj.n2 = 24;obj.str = "一些字符串";IFormatter formatter = new BinaryFormatter();Stream stream = new FileStream("MyFile.bin",F(xiàn)ileMode.Create,F(xiàn)ileAccess.Write,F(xiàn)ileShare.None);formatter.Serialize(stream,obj);stream.Close();   

9、60; 本例使用二進(jìn)制格式化程序進(jìn)行序列化。只需創(chuàng)建一個要使用的流和格式化程序的實例,然后調(diào)用格式化程序的 Serialize 方法。流和要序列化的對象實例作為參數(shù)提供給此調(diào)用。類中包括 private 變量的所有成員變量,都將被序列化,但這一點在本例中未明確體現(xiàn)出來。在這一點上,二進(jìn)制序列化不同于只序列化公共字段的 XML 序列化程序。     將對象還原到它以前的狀態(tài)也非常容易。首先,創(chuàng)建格式化程序和流以進(jìn)行讀取,然后讓格式化程序?qū)ο筮M(jìn)行反序列化。以下代碼片段說明了如何進(jìn)行此操作。IFormatter formatter = new BinaryF

10、ormatter();Stream stream = new FileStream("MyFile.bin",F(xiàn)ileMode.Open,F(xiàn)ileAccess.Read,F(xiàn)ileShare.Read);MyObject obj = (MyObject) formatter.Deserialize(fromStream);stream.Close();/ 下面是證明Console.WriteLine("n1:0",obj.n1);Console.WriteLine("n2:0",obj.n2);Console.WriteLine(&qu

11、ot;str:0",obj.str);     上面所使用的 BinaryFormatter 效率很高,能生成非常緊湊的字節(jié)流。所有使用此格式化程序序列化的對象也可使用它進(jìn)行反序列化,對于序列化將在 .NET 平臺上進(jìn)行反序列化的對象,此格式化程序是一個理想的工具。需要注意的是,對對象進(jìn)行反序列化時并不調(diào)用構(gòu)造函數(shù)。對反序列化添加這項約束,是出于性能方面的考慮。但是,這違反了對象編寫者通常采用的一些運(yùn)行時約定,因此,開發(fā)人員在將對象標(biāo)記為可序列化時,應(yīng)確??紤]了這一特殊約定。     如果要求具有可移植性

12、,應(yīng)該使用 SoapFormatter。所要做的更改只是將以上代碼中的格式化程序換成 SoapFormatter,而 Serialize 和 Deserialize 調(diào)用不變。對于上面使用的示例,該格式化程序?qū)⑸梢韵陆Y(jié)果。<SOAP-ENV:Envelope<SOAP-ENV:Body><a1:MyObject id="ref-1">      <n1>1</n1>      <n2>24</n2>      <str id="ref-3">一些字符串</str>  </a1:MyObject> </SOAP-ENV:Body></SOAP-ENV:Envelope>

溫馨提示

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

最新文檔

評論

0/150

提交評論