.NET Framework 序列化的基本概念
更新:2007 年 11 月
序列化為將物件轉換成位元組資料流的程序,以便將物件保存到記憶體、資料庫或檔案。主要目的是要儲存物件的狀態,以便能在需要時重新建立該物件。此回復程序稱為還原序列化 (Deserialization)。
序列化如何運作
此圖例會顯示序列化的整體程序。
將物件序列化為資料流,不僅會包含資料,還會有物件型別的相關資訊,如物件的版本、文化特性 (Culture) 和組件名稱。在此資料流中,可以將物件存放在資料庫、檔案或記憶體中。
使用序列化
序列化可以讓開發人員儲存物件的狀態,並依需要重新建立該物件,以提供物件的儲存區和資料交換。開發人員可以透過序列化執行動作,例如,藉由 Web 服務將物件傳送至遠端應用程式、將物件從一個網域傳遞到另一個網域、透過防火牆 (Firewall) 傳遞物件以做為 XML 字串,或是在不同的應用程式上維護安全性或使用者專屬資訊。
使物件可序列化
若要將物件序列化,首先必須要有準備序列化的物件、能包含序列化物件的資料流,以及 Formatter。System.Runtime.Serialization 會包含序列化和還原序列化物件所需的類別。
將 SerializableAttribute 屬性 (Attribute) 套用到型別,以表示此型別的執行個體 (Instance) 可以序列化。如果您嘗試要序列化,但是型別沒有 SerializableAttribute 屬性,則會擲回 SerializationException 例外狀況。
若您不要類別中的欄位是可序列化的,請套用 NonSerializedAttribute 屬性。如果可序列化型別的欄位包含指標、控制代碼或其他特定環境專屬的資料結構,而且欄位無法在不同環境中有意義地還原,可能要使該欄位不可序列化。
如果序列化類別包含其他標示為 SerializableAttribute 之類別的物件參考,則這些物件也可以序列化。
二進位和 XML 序列化
您可以使用二進位或 XML 序列化。在二進位序列化中,所有成員 (即使是唯讀的) 都會加以序列化,而且效能也會增強。XML 序列化會提供更多可讀取的程式碼,共用物件的更大彈性,以及互通性 (Iinteroperability) 目的的用途。
二進位序列化
二進位序列化會使用二進位編碼方式,以產生精簡型態的序列化供使用,如儲存區或通訊端 (Socket) 架構的網路資料流。透過防火牆傳遞資料並不合適,但是在儲存資料時會提供較佳的效能。
XML 序列化
XML 序列化會將物件的公用 (Public) 欄位和屬性,或是方法的參數和傳回值,序列化為與特定 XML 結構描述 (Schema) 定義語言 (XSD) 文件相符的 XML 資料流。XML 序列化會產生強型別 (Strongly Typed) 類別,其中包含的公用屬性和欄位都轉換為序列格式。System.Xml.Serialization 會包含序列化和還原序列化 XML 所需的類別。
您可以將屬性套用到類別和類別成員,以便控制 XmlSerializer 序列化或還原序列化類別之執行個體的方式。如需詳細資訊,請參閱使用屬性控制 XML 序列化和控制 XML 序列化的屬性。
此表會列出與 XML 序列化關聯的工作:
若要 |
請參閱 |
---|---|
序列化物件 |
|
還原序列化物件 |
|
產生類別和 XML 結構描述文件 |
|
限定 XML 項目和 XML 屬性名稱 |
|
為 XML 資料流指定其他項目名稱 |
|
控制衍生類別 (Derived Class) 的序列化 |
SOAP 序列化
XML 序列化也可用來將物件序列化為與 SOAP 規格相符的 XML 資料流。SOAP 是以 XML 為基礎的通訊協定,特別設計來傳輸使用 XML 的程序呼叫。與標準 XML 序列化相同,屬性可用來控制由 XML Web Service 所產生的常值樣式 SOAP 訊息。如需詳細資訊,請參閱以 XML Web 服務進行 XML 序列化和控制編碼 SOAP 序列化的屬性。
此表會列出與 SOAP 編碼之 XML 序列化關聯的工作:
若要 |
請參閱 |
---|---|
將物件序列化為 SOAP 編碼的 XML 資料流 |
|
覆寫 SOAP 編碼的 XML 序列化 |
基本和自訂序列化
序列化可以兩種方式執行:基本和自訂。基本序列化會使用 .NET Framework 自動將物件序列化。
基本序列化
基本序列化的唯一要求是物件必須套用 SerializableAttribute 屬性。您可以使用 NonSerializedAttribute,不讓特定欄位序列化。
使用基本序列化時,物件的版本控制會產生問題,在這種請況下,最好使用自訂序列化。基本序列化為執行序列化最簡便的方式,但是不會對程序提供很多的控制。
自訂序列化
在自訂序列化中,您可以確實指定要序列化哪些物件,以及如何完成序列化。類別必須標示為 SerializableAttribute,並實作 ISerializable 介面。
如果您也要以自訂方式還原序列化物件,則必須使用自訂建構函式 (Constructor)。
設計工具序列化
設計工具序列化為特殊格式的序列化,包含通常會與開發工具關聯的物件持續性 (Persistence)。設計工具序列化為將物件 Graph 轉換為原始程式檔 (Source File) 的程序,稍後可以用於復原物件 Graph。原始程式檔可以包含程式碼、標記,甚至是 SQL 資料表資訊。如需詳細資訊,請參閱設計工具序列化概觀。