Serializable在C 中的作用

2021-10-08 06:41:11 字數 3202 閱讀 8182

system.

serializableattribute

序列化是指儲存和獲取磁碟檔案、記憶體或其他地方中的物件。在序列化時,所有的例項資料都儲存到

儲存介質上,在取消序列化時,物件會被還原,且不能與其原例項區別開來。

只需給類新增

serializable

屬性,就可以實現序列化例項的成員。

並行化是序列化的逆過程,資料從儲存介質中讀取出來,並賦給類的例項變數。

serializable

在c#中的作用

.net 中的物件序列化

簡介序列化是指將物件例項的狀態儲存到儲存**的過程。在此過程中,先將物件的公共欄位和私有欄位以

及類的名稱(包括類所在的程式集)轉換為位元組流,然後再把位元組流寫入資料流。在隨後對物件進行反序

列化時,將建立出與原物件完全相同的副本。

在物件導向的環境中實現序列化機制時,必須在易用性和靈活性之間進行一些權衡。只要您對此過程有

足夠的控制能力,就可以使該過程在很大程度上自動進行。例如,簡單的二進位制序列化不能滿足需要,或

者,由於特定原因需要確定類中那些字段需要序列化。以下各部分將**

.net 

框架提供的可靠的序列化

機制,並著重介紹使您可以根據需要自定義序列化過程的一些重要功能。

持久儲存

我們經常需要將物件的字段值儲存到磁碟中,並在以後檢索此資料。儘管不使用序列化也能完成這項工

作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤物件的層次結構時,會變得越來越複雜。可以

想象一下編寫包含大量物件的大型業務應用程式的情形,程式設計師不得不為每乙個物件編寫**,以便將字

段和屬性儲存至磁碟以及從磁碟還原這些欄位和屬性。序列化提供了輕鬆實現這個目標的快捷方法。

公共語言執行時 (clr) 管理物件在記憶體中的分布,.net 框架則通過使用反射提供自動的序列化機制。

物件序列化後,類的名稱、程式集以及類例項的所有資料成員均被寫入儲存**中。物件通常用成員變數

來儲存對其他例項的引用。類序列化後,序列化引擎將跟蹤所有已序列化的引用物件,以確保同一物件不

被序列化多次。.net 框架所提供的序列化體系結構可以自動正確處理物件圖表和迴圈引用。對物件圖表的

唯一要求是,由正在進行序列化的物件所引用的所有物件都必須標記為 serializable(請參閱基本序列

化)。否則,當序列化程式試圖序列化未標記的物件時將會出現異常。

當反序列化已序列化的類時,將重新建立該類,並自動還原所有資料成員的值。

按值封送

物件僅在建立物件的應用程式域中有效。除非物件是從

marshalbyrefobject 

派生得到或標記為

serializable

,否則,任何將物件作為引數傳遞或將其作為結果返回的嘗試都將失敗。如果物件標記為

serializable

,則該物件將被自動序列化,並從乙個應用程式域傳輸至另乙個應用程式域,然後進行反序

列化,從而在第二個應用程式域中產生出該物件的乙個精確副本。此過程通常稱為按值封送。

如果物件是從

marshalbyrefobject 

派生得到,則從乙個應用程式域傳遞至另乙個應用程式域的是物件

引用,而不是物件本身。

也可以將從

marshalbyrefobject 

派生得到的物件標記為

serializable

。遠端使用此物件時,負責進行序列化並已預先配置為 surrogateselector 的格式化程式將控制序列化過程,

並用乙個**替換所有從 marshalbyrefobject派生得到的物件。如果沒有預先配置為 surrogateselector,

序列化體系結構將遵從下面的標準序列化規則(請參閱序列化過程的步驟)。

基本序列化 

要使乙個類可序列化,最簡單的方法是使用 serializable 屬性對它進行標記,如下所示:  

[serializable] 

public class myobject  

以下**片段說明了如何將此類的乙個例項序列化為乙個檔案:  

myobject obj = new myobject(); obj.n1 = 1; obj.n2 = 24; 

obj.str = "一些字串"; 

iformatter formatter = new binaryformatter(); 

stream stream = new filestream("myfile.bin", filemode.create, fileaccess.write, fileshare.none); formatter.serialize(stream, obj); stream.close(); 

本例使用二進位制格式化程式進行序列化。您只需建立乙個要使用的流和格式化程式的例項,然後呼叫格式化程式的 serialize 方法。流和要序列化的物件例項作為引數提供給此呼叫。類中的所有成員變數(甚至標記為 private 的變數)都將被序列化,但這一點在本例中未明確體現出來。在這一點上,二進位制序列化不同於只序列化公共欄位的 xml 序列化程式。  

將物件還原到它以前的狀態也非常容易。首先,建立格式化程式和流以進行讀取,然後讓格式化程式對物件進行反序列化。以下**片段說明了如何進行此操作。  

iformatter formatter = new binaryformatter(); 

stream stream = new filestream("myfile.bin", filemode.open, fileaccess.read, fileshare.read); 

myobject obj = (myobject) formatter.deserialize(fromstream); stream.close();  

// 下面是證明 

console.writeline("n1: ", obj.n1); console.writeline("n2: ", obj.n2); console.writeline("str: ", obj.str); 

上面所使用的 binaryformatter 效率很高,能生成非常緊湊的位元組流。所有使用此格式化程式序列化的物件也可使用它進行反序列化,對於序列化將在 .net 平台上進行反序列化的物件,此格式化程式無疑是乙個理想工具。需要注意的是,對物件進行反序列化時並不呼叫建構函式。對反序列化新增這項約束,是出於效能方面的考慮。但是,這違反了物件編寫者通常採用的一些執行時約定,因此,開發人員在將物件標記為可序列化時,應確保考慮了這一特殊約定。

C 中Serializable序列化

序列化就是是將物件轉換為容易傳輸的格式的過程,一般情況下轉化打流檔案,放入記憶體或者io檔案 中。例如,可以序列化乙個物件,然後使用 http 通過 internet 在客戶端和伺服器之間傳輸該物件,或者和其它應用程式共享使用。反之,反序列化根據流重新構造物件。一 幾種序列化技術 1 二進位制序列化...

C 中的 序列化 Serializable 理解

我的理解 比如用乙個類描述一張合同,而這個類例項化後其中的字段儲存著合同的資訊,如果現在要把這個類的例項傳送到另一台機器 另乙個窗體或是想儲存這個類以便以後再取出來用 持久化物件 可以對這個類進行序列化 序列化實際上是乙個資訊流 傳送或儲存,用的時候再反序列化重新生成這個物件 為什麼您想要使用序列化...

C 中的 序列化 Serializable 理解

為什麼您想要使用序列化?有兩個最重要的原因促使對序列化的使用 乙個原因是將物件的狀態保持在儲存 中,以便可以在以後重新建立精確的副本 另乙個原因是通過值將物件從乙個應用程式域傳送到另乙個應用程式域中。例如,序列化可用於在 asp.net 中儲存會話狀態並將物件複製到 windows 窗體的剪貼簿中。...