System.Runtime.Serialization.DataContractSerializer 類別

本文提供此 API 參考文件的補充備註。

使用 DataContractSerializer 類別,即可將某個型別的執行個體序列化及還原序列化成 XML 資料流或文件。 例如,您可以使用包含基本資料的屬性 (例如姓名和地址) 來建立名為 Person 的型別。 接著,您可以建立及操作 Person 類別的執行個體,並將所有的屬性值寫入 XML 文件中以供日後擷取,或寫入 XML 資料流中以供立即傳輸。 最重要的是, DataContractSerializer 是用來串行化和還原串行化在 Windows Communication Foundation (WCF) 訊息中傳送的數據。 將 DataContractAttribute 屬性套用至類別,並將 DataMemberAttribute 屬性套用至類別成員,即可指定已序列化的屬性和欄位。

如需可串行化的型別清單,請參閱 數據合約串行化程式支援的類型。

如果要使用 DataContractSerializer,請先建立類別的執行個體,以及適合用於寫入或讀取此格式的物件;例如,XmlDictionaryWriter 的執行個體。 接著,呼叫 WriteObject 方法以保留資料。 如果要擷取資料,請建立適合用於讀取此資料格式的物件 (例如適合 XML 文件的 XmlDictionaryReader),接著呼叫 ReadObject 方法。

如需使用 DataContractSerializer的詳細資訊,請參閱 串行化和還原串行化

您可以使用用戶端應用程式組態檔中的 dataContractSerializer 元素,設定資料合約串行化程式<>的類型。

準備類別以進行串行化或還原串行化

DataContractSerializer 會組合 DataContractAttributeDataMemberAttribute 類別一起使用。 如果要準備類別以進行序列化,請將 DataContractAttribute 套用至此類別。 對於每個會傳回您要序列化之資料的類別成員,請套用 DataMemberAttribute。 您可以序列化欄位和屬性,不論其存取範圍為何:private、protected、internal、protected internal 或 public。

例如,您的結構描述指定含有 Customer 屬性的 ID,但是您的現有應用程式是使用名為 Person 且具有 Name 屬性的型別。 如果要建立符合該合約的型別,請先將 DataContractAttribute 套用至類別。 然後將 DataMemberAttribute 套用至要序列化的每個欄位或屬性。

注意

您可以將 DataMemberAttribute 同時套用至 Private 和 Public 成員。

XML 的最終格式並不要求一定是文字。 相反地,DataContractSerializer 會將資料寫成為 XML infoset,這樣您便可以將資料寫成任何可由 XmlReaderXmlWriter 辨識的格式。 建議您使用 XmlDictionaryReaderXmlDictionaryWriter 類別來讀取和寫入,因為這兩種類別已針對使用 DataContractSerializer 完成最佳化。

如果您要建立的類別具有在串行化或還原串行化發生之前必須填入的欄位或屬性,請使用回呼屬性,如版本容錯串行化回呼中所述

將 新增至已知類型的集合

當序列化或還原序列化物件時,其型別必須是 DataContractSerializer「已知」的型別。 一開始會先建立會實作 IEnumerable<T> (例如 List<T>) 之類別的執行個體,並將已知型別新增至集合。 然後使用採用的其中一個多載IEnumerable<T>來建立 的實體DataContractSerializer(例如 , DataContractSerializer(Type, IEnumerable<Type>)

注意

不同於其他基本類型, DateTimeOffset 結構預設不是已知的類型,因此必須手動新增至已知類型清單(請參閱 數據合約已知類型)。

往後相容性

DataContractSerializer 知道資料合約已設計為與合約的未來版本相容。 這些型別會實作 IExtensibleDataObject 介面。 此介面的特色是會傳回 ExtensionData 物件的 ExtensionDataObject 屬性。 如需詳細資訊,請參閱向前相容資料合約

在部分信任下執行

在還原序列化期間產生目標物件時,DataContractSerializer 不會呼叫目標物件的建構函式。 如果您撰寫可從 部分信任存取的 [DataContract] 類型(也就是說,它是公用的,且在已 AllowPartiallyTrustedCallers 套用屬性的元件中),而且會執行某些安全性相關動作,您必須知道不會呼叫建構函式。 特別值得一提的是,下列技巧將無法運作:

  • 如果您嘗試透過將建構函式設為 internal 或 private,或是將 LinkDemand 新增至建構函式等方式來限制部分信任存取,上述這些方式都無法在部分信任環境中的還原序列化期間發揮作用。
  • 如果您撰寫的類別程式碼會假定該建構函式已經執行,則此類別可能會處於易遭利用的無效 internal 狀態。