System.Runtime.Serialization.DataContractAttribute 類別

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

DataContractAttribute 屬性套用至 DataContractSerializer 在序列化 (Serialization) 和還原序列化 (Deserialization) 作業中所使用的型別 (類別、結構或列舉)。 如果您使用 Windows Communication Foundation (WCF) 基礎結構來傳送或接收訊息,則也應該將 套用 DataContractAttribute 至保存及操作訊息中所傳送數據的任何類別。 如需數據合約的詳細資訊,請參閱 使用數據合約

您也必須將 DataMemberAttribute 套用至負責保存您要序列化之值的任何欄位、屬性或事件。 透過套用 DataContractAttribute,您便可以明確地讓 DataContractSerializer 能夠序列化和還原序列化資料。

警告

您可以將 DataMemberAttribute 套用至私用欄位。 請注意,此欄位 (即使它是私用欄位) 傳回的資料會進行序列化和還原序列化,因此可能會遭到惡意使用者或處理序的檢視或攔截。

如需數據合約的詳細資訊,請參閱使用數據合約所列的主題。

資料合約

數據合約是一組欄位的抽象描述,其中包含每個欄位的名稱和數據類型。 資料合約存在於任何單一實作之外,以便讓不同平台上的服務能夠相互操作。 只要在服務之間傳遞的資料符合相同的合約,所有服務就能夠處理該份資料。 此處理也稱為 鬆散結合的系統。 資料合約也類似一種介面,而在這種介面中,合約會指定資料必須如何傳遞才可讓應用程式加以處理。 例如,資料合約可能會要求名為 "Person" 並包含兩個名稱分別為 "FirstName" 和 "LastName" 之文字欄位的資料型別。 若要建立資料合約,請將 DataContractAttribute 套用至類別,並將 DataMemberAttribute 套用至必須進行序列化的任何欄位或屬性。 當完成序列化之後,資料就會符合已在該型別中隱含內建的資料合約。

注意

就繼承行為來看,資料合約與實際的介面有很大的不同。 介面是繼承自任何衍生的型別。 當您將 DataContractAttribute 套用至基底類別時,衍生的型別並不會繼承屬性或行為。 但是,如果衍生的型別擁有資料合約,該基底類別的資料成員就會進行序列化。 但是您必須將 DataMemberAttribute 套用至衍生類別的新成員,才能讓這些成員進行序列化。

XML 架構檔和 SvcUtil 工具

如果您要與其他服務交換資料,就必須描述資料合約。 若是最新版本的 DataContractSerializer,則可以使用 XML 結構描述來定義資料合約 (其他形式的元數據/描述可以用於相同的用途。若要從您的應用程式建立 XML 架構,請使用 ServiceModel 元數據公用程式工具 (Svcutil.exe) 搭配 /dconly 命令行選項。 根據預設,如果工具的輸入項目是組件時,工具就會產生 XML 結構描述集合,而此集合會定義在該組件中找到的所有資料合約型別。 相反地,您也可以使用 Svcutil.exe 工具來建立符合 XML 結構描述需求的 Visual Basic 或 C# 類別定義,而這些結構描述會使用能夠透過資料合約表示的建構。 在此情況下, 不需要 /dconly 命令行選項。

根據預設,如果 Svcutil.exe 工具的輸入項目是 XML 結構描述,工具就會建立類別集合。 如果您檢查這些類別,您就會發現此時已套用了 DataContractAttribute。 您可以使用這些類別來建立新的應用程式,以便處理必須與其他服務交換的資料。

您也可以針對傳回 Web 服務描述語言 (WSDL) 檔的端點執行此工具,以自動產生程式代碼和設定,以建立 Windows Communication Foundation (WCF) 用戶端。 所產生的程式碼會包含以 DataContractAttribute 標記的型別。

重複使用現有的類型

資料合約有兩項基本要求,一個是穩定的名稱,另一個則是成員的清單。 穩定的名稱是由命名空間統一資源識別元 (URI) 以及合約的本機名稱組成。 根據預設,當您將 套用 DataContractAttribute 至類別時,它會使用類別名稱作為本機名稱,而類別的命名空間(前面加上 "http://schemas.datacontract.org/2004/07/"開頭)作為命名空間 URI。 您可以藉由設定 NameNamespace 屬性來覆寫預設值。 您也可以藉由將 ContractNamespaceAttribute 套用至命名空間以變更命名空間。 當現有的型別能夠完全依照需求處理資料,但卻擁有與資料合約不同的命名空間和類別名稱時,您就可以使用這項功能。 藉由覆寫預設值,您就可以重複使用現有的型別,並使已序列化的資料符合資料合約。

注意

您可以在任何程式碼中使用 DataContract 一字來代替較長的 DataContractAttribute

版本管理

資料合約也能配合本身的較新版本。 也就是說,當合約的較新版本含有其他資料時,這時會儲存該份資料,然後將其原封不動地傳回給傳送者。 若要執行這個步驟,請實作 IExtensibleDataObject 介面。

如需版本設定的詳細資訊,請參閱 數據合約版本控制