本文提供此 API 參考文件的補充備註。
使用 類別 DataContractSerializer ,將型別的實例串行化和還原串行化為 XML 數據流或檔。 例如,您可以使用包含基本數據的屬性來建立名為 Person 的類型,例如名稱和位址。 然後,您可以建立及操作 Person 類別的實例,並在 XML 檔中寫入所有的屬性值,以供稍後擷取,或在 XML 流中立即傳輸。 最重要的是,DataContractSerializer 用於在 Windows Communication Foundation(WCF)訊息中對傳送的數據進行序列化和反序列化。 將 DataContractAttribute 屬性套用至類別,並將 DataMemberAttribute 屬性套用至類別成員,以指定串行化的屬性和字段。
如需可串行化的型別清單,請參閱 數據合約串行化程式支援的類型。
若要使用 DataContractSerializer,請先建立類別的實例,以及適合寫入或讀取格式的物件,例如的 XmlDictionaryWriter實例。 然後呼叫 WriteObject 方法來保存數據。 若要擷取數據,請建立適合讀取數據格式的物件(例如 XmlDictionaryReader XML 檔的 ),並呼叫 ReadObject 方法。
如需使用 DataContractSerializer的詳細資訊,請參閱 串行化和還原串行化。
您可以使用用戶端應用程式組態檔中的 dataContractSerializer 元素,設定資料合約串行化程式<>的類型。
準備類別以進行序列化或反序列化
DataContractSerializer會與 DataContractAttribute 和 DataMemberAttribute 類別搭配使用。 若要準備類別以進行串行化,請將 套用 DataContractAttribute 至 類別。 針對傳回您要串行化之資料之類別的每個成員,套用 DataMemberAttribute。 您可以序列化欄位和屬性,不論存取範圍:私有、受保護、內部、內部保護或公用。
例如,您的架構指定了一個具有 Customer 屬性的 ID,但您已經有一個現有的應用程式,它使用一個名為 Person 的類型,其中具有 Name 屬性。 若要建立符合合約的類型,請先將 套用 DataContractAttribute 至 類別。 然後將 套用 DataMemberAttribute 至您想要串行化的每個欄位或屬性。
備註
您可以套用 DataMemberAttribute 至私人和公共成員。
XML 的最終格式不一定是文字。 反之,會將DataContractSerializer數據寫入為 XML 資訊集,這可讓您將數據寫入XmlReader和XmlWriter所辨識的任何格式。 建議您使用 XmlDictionaryReader 與 XmlDictionaryWriter 類別來讀取與寫入,因為兩者都已優化以使用 DataContractSerializer。
如果您要建立的類別具有必須在序列化或反序列化之前填入的欄位或屬性,請使用回調屬性,如 Version-Tolerant 序列化回調中所述。
加入至已知類型的集合中
在序列化或反序列化物件時,需要該類型對 DataContractSerializer 是已知的。 首先,建立一個實作 IEnumerable<T> 的類別(例如 List<T>)的實例,並將已知型別新增至集合。 然後使用其中一個接受DataContractSerializer作為參數的多載來建立IEnumerable<T>的實例(例如,DataContractSerializer(Type, IEnumerable<Type>))。
備註
不同於其他基本類型, DateTimeOffset 結構預設不是已知的類型,因此必須手動新增至已知類型清單(請參閱 數據合約已知類型)。
向前相容性
DataContractSerializer 能理解那些被設計成與合約未來版本相容的數據合約。 這類類型會實作 IExtensibleDataObject 介面。 介面具有 ExtensionData 傳回 ExtensionDataObject 物件的屬性。 如需詳細資訊,請參閱 Forward-Compatible 數據合約。
在部分信任下執行
在還原串行化期間具現化目標物件時, DataContractSerializer 不會呼叫目標物件的建構函式。 如果您撰寫一個可從部分信任環境存取的 [DataContract] 類型(也就是說,它是公開的,並且所在的組件已套用了 AllowPartiallyTrustedCallers 屬性),而且這個類型會執行某些與安全性相關的操作,則您必須知道建構函式不會被呼叫。 特別是下列技術無法運作:
- 如果您嘗試藉由將建構函式設為內部或私用,或將 加入
LinkDemand至建構函式來限制部分信任存取,則這兩者在部分信任的還原串行化期間都沒有任何作用。 - 如果您撰寫假設建構函式已經執行的類別,該類別可能會進入無效的內部狀態,這種狀態可能被利用。