序列化與還原序列化概述
序列化,它又稱序列化,是.NET運行時環境用來支援使用者定義型別的流化的機制。序列化就是把一個對象儲存到一個檔案或資料庫欄位中去,還原序列化就是在適當的時候把這個檔案再轉化成原來的對象使用。其目的是以某種儲存形成使自訂對象持久化,或者將這種對象從一個地方傳輸到另一個地方。
當兩個進程在進行遠程通訊時,彼此可以發送各種類型的資料。無論是何種類型的資料,都會以二進位序列的形式在網路上傳送。發送方需要把這個對象轉換為位元組序列,才能在網路上傳送;接收方則需要把位元組序列再恢複為對象。
把對象轉換為位元組序列的過程稱為對象的序列化序列化序列化序列化。
把位元組序列恢複為對象的過程稱為對象的還原序列化還原序列化還原序列化還原序列化。
對象的序列化主要有兩種用途對象的序列化主要有兩種用途對象的序列化主要有兩種用途對象的序列化主要有兩種用途:
1) 把對象的位元組序列永久地儲存到硬碟上把對象的位元組序列永久地儲存到硬碟上把對象的位元組序列永久地儲存到硬碟上把對象的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中通常存放在一個檔案中通常存放在一個檔案中通常存放在一個檔案中;
我們經常需要將對象的欄位值儲存到磁碟中,並在以後檢索此資料。儘管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤對象的階層時,會變得越來越複雜。可以想象一下編寫包含大量對象的大型商務應用程式的情形,程式員不得不為每一個對象編寫代碼,以便將欄位和屬性儲存至磁碟以及從磁 盤還原這些欄位和屬性。序列化提供了輕鬆實現這個目標的快捷方法。通用語言執行平台 (CLR) 管理對象在記憶體中的分布,.NET 架構則通過使用反射提供自動的序列化機制。對象序列化後,類的名稱、程式集以及類執行個體的所有資料成員均被寫入儲存媒體中。對象通常用成員變數來儲存對其他執行個體的引用。類序列化後,序列化引擎將跟蹤所有已序列化的引用對象,以確保同一對象不被序列化多次。.NET 架構所提供的序列化體繫結構可以自動正確處理對象圖表和循環參考。對對象圖表的唯一要求是,由進行中序列化的對象所引用的所有對象都必須標記為 Serializable(請參閱基 本序列化)。否則,當序列化程式試圖序列化未標記的對象時將會出現異常。當還原序列化已序列化的類時,將重新建立該類,並自動還原所有資料成員的值。
2) 在網路上傳送對象的位元組序列在網路上傳送對象的位元組序列在網路上傳送對象的位元組序列在網路上傳送對象的位元組序列。
對象僅在建立對象的應用程式定義域中有效。除非對象是從MarshalByRefObject派生得到或標記為Serializable,否則,任何將對象作為參數傳遞或將其作為結果返回的嘗試都將失敗。如果對象標記為Serializable,則該對象將被自動序列化,並從一個應用程式定義域傳輸至另一個應用程式定義域,然後進行還原序列化,從而在第二個應用程式定義域中產生出該對象的一個完全重複項。此過程通常稱為按值封送。如果對象是從MarshalByRefObject派生得到,則從一個應用程式定義域傳遞至另一個應用程式定義域的是對象引用,而不是對象本身。也可以將從MarshalByRefObject派生得到的對象標記為Serializable。遠程使用此對象時,負責進行序列化並已預先配置為SurrogateSelector的格式化程式將控制序列化過程,並用一個代理替換所有從MarshalByRefObject派生得到的對象。如果沒有預先配置為SurrogateSelector,序列化體繫結構將遵從下面的標準序列化規則