serializable在c#中的作用

serializable在c#中的作用

ID:5770179

大?。?7.00 KB

頁數(shù):2頁

時(shí)間:2017-12-24

serializable在c#中的作用_第1頁
serializable在c#中的作用_第2頁
資源描述:

《serializable在c#中的作用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。

1、System.SerializableAttribute串行化是指存儲(chǔ)和獲取磁盤文件、內(nèi)存或其他地方中的對(duì)象。在串行化時(shí),所有的實(shí)例數(shù)據(jù)都保存到存儲(chǔ)介質(zhì)上,在取消串行化時(shí),對(duì)象會(huì)被還原,且不能與其原實(shí)例區(qū)別開來。只需給類添加Serializable屬性,就可以實(shí)現(xiàn)串行化實(shí)例的成員。并行化是串行化的逆過程,數(shù)據(jù)從存儲(chǔ)介質(zhì)中讀取出來,并賦給類的實(shí)例變量。Serializable在C#中的作用.NET中的對(duì)象序列化簡(jiǎn)介序列化是指將對(duì)象實(shí)例的狀態(tài)存儲(chǔ)到存儲(chǔ)媒體的過程。在此過程中,先將對(duì)象的公共字段和私有字段以及類的名稱(包括類所在的程序集)轉(zhuǎn)換為字節(jié)流,然后再把字節(jié)流寫入數(shù)據(jù)流。在

2、隨后對(duì)對(duì)象進(jìn)行反序列化時(shí),將創(chuàng)建出與原對(duì)象完全相同的副本。在面向?qū)ο蟮沫h(huán)境中實(shí)現(xiàn)序列化機(jī)制時(shí),必須在易用性和靈活性之間進(jìn)行一些權(quán)衡。只要您對(duì)此過程有足夠的控制能力,就可以使該過程在很大程度上自動(dòng)進(jìn)行。例如,簡(jiǎn)單的二進(jìn)制序列化不能滿足需要,或者,由于特定原因需要確定類中那些字段需要序列化。以下各部分將探討.NET框架提供的可靠的序列化機(jī)制,并著重介紹使您可以根據(jù)需要自定義序列化過程的一些重要功能。持久存儲(chǔ)我們經(jīng)常需要將對(duì)象的字段值保存到磁盤中,并在以后檢索此數(shù)據(jù)。盡管不使用序列化也能完成這項(xiàng)工作,但這種方法通常很繁瑣而且容易出錯(cuò),并且在需要跟蹤對(duì)象的層次結(jié)構(gòu)時(shí),會(huì)變得越來越復(fù)

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

4、在進(jìn)行序列化的對(duì)象所引用的所有對(duì)象都必須標(biāo)記為Serializable(請(qǐng)參閱基本序列化)。否則,當(dāng)序列化程序試圖序列化未標(biāo)記的對(duì)象時(shí)將會(huì)出現(xiàn)異常。當(dāng)反序列化已序列化的類時(shí),將重新創(chuàng)建該類,并自動(dòng)還原所有數(shù)據(jù)成員的值。按值封送對(duì)象僅在創(chuàng)建對(duì)象的應(yīng)用程序域中有效。除非對(duì)象是從MarshalByRefObject派生得到或標(biāo)記為Serializable,否則,任何將對(duì)象作為參數(shù)傳遞或?qū)⑵渥鳛榻Y(jié)果返回的嘗試都將失敗。如果對(duì)象標(biāo)記為Serializable,則該對(duì)象將被自動(dòng)序列化,并從一個(gè)應(yīng)用程序域傳輸至另一個(gè)應(yīng)用程序域,然后進(jìn)行反序列化,從而在第二個(gè)應(yīng)用程序域中產(chǎn)生出該對(duì)象的一個(gè)

5、精確副本。此過程通常稱為按值封送。如果對(duì)象是從MarshalByRefObject派生得到,則從一個(gè)應(yīng)用程序域傳遞至另一個(gè)應(yīng)用程序域的是對(duì)象引用,而不是對(duì)象本身。也可以將從MarshalByRefObject派生得到的對(duì)象標(biāo)記為Serializable。遠(yuǎn)程使用此對(duì)象時(shí),負(fù)責(zé)進(jìn)行序列化并已預(yù)先配置為SurrogateSelector的格式化程序?qū)⒖刂菩蛄谢^程,并用一個(gè)代理替換所有從MarshalByRefObject派生得到的對(duì)象。如果沒有預(yù)先配置為SurrogateSelector,序列化體系結(jié)構(gòu)將遵從下面的標(biāo)準(zhǔn)序列化規(guī)則(請(qǐng)參閱序列化過程的步驟)。基本序列化要使一個(gè)類

6、可序列化,最簡(jiǎn)單的方法是使用Serializable屬性對(duì)它進(jìn)行標(biāo)記,如下所示:[Serializable]publicclassMyObject...{publicintn1=0;publicintn2=0;publicStringstr=null;}以下代碼片段說明了如何將此類的一個(gè)實(shí)例序列化為一個(gè)文件:MyObjectobj=newMyObject();obj.n1=1;obj.n2=24;obj.str="一些字符串";IFormatterformatter=newBinaryFormatter();Streamstream=newFileStream("MyFil

7、e.bin",FileMode.Create,FileAccess.Write,FileShare.None);formatter.Serialize(stream,obj);stream.Close();本例使用二進(jìn)制格式化程序進(jìn)行序列化。您只需創(chuàng)建一個(gè)要使用的流和格式化程序的實(shí)例,然后調(diào)用格式化程序的Serialize方法。流和要序列化的對(duì)象實(shí)例作為參數(shù)提供給此調(diào)用。類中的所有成員變量(甚至標(biāo)記為private的變量)都將被序列化,但這一點(diǎn)在本例中未明確體現(xiàn)出來。在這一點(diǎn)上,二進(jìn)制序列化不同于只序列化公共字段的

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。