原文地址:點擊開啟連結
DataContractSerializer 類
使用提供的資料合約,將類型執行個體序列化和還原序列化為 XML 流或文檔。 無法繼承此類。
命名空間: System.Runtime.Serialization
程式集: System.Runtime.Serialization(在 System.Runtime.Serialization.dll 中)
備忘
使用 DataContractSerializer 類可以將類型執行個體序列化和還原序列化為 XML 流或文檔。 通過將 DataContractAttribute 特性應用於類,而將DataMemberAttribute 特性應用於類成員,可以指定要序列化的屬性和欄位。
從字面意思來理解就是:資料契約序列化,本文主要是講解用DataContractSerializer 序列化和還原序列化.
DataContractAttribute與DataMenmberAttribute
//------------------------------------------------------------// Copyright (c) Microsoft Corporation. All rights reserved.//------------------------------------------------------------ namespace System.Runtime.Serialization{// 摘要: // 指定該類型要定義或實現一個資料合約,並可由序列化程式(如 System.Runtime.Serialization.DataContractSerializer)進行序列化。 // 若要使其類型可序列化,類型作者必須為其類型定義資料合約。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum, Inherited = false, AllowMultiple = false)] public sealed class DataContractAttribute : Attribute { string name; string ns; bool isNameSetExplicitly; bool isNamespaceSetExplicitly; bool isReference; bool isReferenceSetExplicitly;// 摘要: // 初始化 System.Runtime.Serialization.DataContractAttribute 類的新執行個體。 public DataContractAttribute() { } // 摘要: // 擷取或設定一個值,該值指示是否保留對象引用資料。 // // 返回結果: // 如果使用標準 XML 保留對象引用資料,則為 true;否則為 false。 預設值為 false。 public bool IsReference { get { return isReference; } set { isReference = value; isReferenceSetExplicitly = true; } } public bool IsReferenceSetExplicitly { get { return isReferenceSetExplicitly; } } // // 摘要: // 擷取或設定類型的資料合約的命名空間。 // // 返回結果: // 協定的命名空間。 public string Namespace { get { return ns; } set { ns = value; isNamespaceSetExplicitly = true; } } public bool IsNamespaceSetExplicitly { get { return isNamespaceSetExplicitly; } } // // 摘要: // 擷取或設定類型的資料合約的名稱。 // // 返回結果: // 資料合約的本地名稱。 預設值是應用了該屬性的類的名稱。 public string Name { get { return name; } set { name = value; isNameSetExplicitly = true; } } public bool IsNameSetExplicitly { get { return isNameSetExplicitly; } } }}
DataContractAttribute
從應用在DataContractAttribute上的AttributeUsageAttribute特性看,該特性只能用於枚舉、類、結構體而不能應用於介面,從關鍵字sealed知道DataContractAttribute是不可被繼承的。AllowMutiple屬性為False,表明一個資料類型上只能應用一個DataContractAttribute特性。
從上面對DataContractAttribute定義看出DataContractAttribute僅僅包含5個屬性成員,其中Name和Namespace表示資料契約的名稱和命名空間,IsReference表示在進行序列化的時候是否保持對象現有的引用結構,該屬性預設值為False。
資料契約成員採用顯示選擇機制,也就是說,應用了DataContractAttribute特性的資料類型的屬性/欄位不會自動產生契約的資料成員,而只有那些應用了DataMemberAttribute特性的屬性/欄位才屬於資料契約的成員。
//------------------------------------------------------------// Copyright (c) Microsoft Corporation. All rights reserved.//------------------------------------------------------------ namespace System.Runtime.Serialization{ // 摘要: // 當應用於類型的成員時,指定該成員是資料合約的一部分並可由 System.Runtime.Serialization.DataContractSerializer // 進行序列化。 [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = false, AllowMultiple = false)] public sealed class DataMemberAttribute : Attribute { string name; bool isNameSetExplicitly; int order = -1; bool isRequired; bool emitDefaultValue = Globals.DefaultEmitDefaultValue; // 摘要: // 初始化 System.Runtime.Serialization.DataMemberAttribute 類的新執行個體。 public DataMemberAttribute() { } // // 摘要: // 擷取或設定資料成員名稱。 // // 返回結果: // 該資料成員的名稱。 預設值是應用該屬性的目標的名稱。 public string Name { get { return name; } set { name = value; isNameSetExplicitly = true; } } public bool IsNameSetExplicitly { get { return isNameSetExplicitly; } } // // 摘要: // 擷取或設定成員的序列化和還原序列化的順序。 // // 返回結果: // 序列化或還原序列化的數字順序。 public int Order { get { return order; } set { if (value < 0) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.OrderCannotBeNegative))); order = value; } }// 摘要: // 擷取或設定一個值,該值用於指示序列化引擎在讀取或還原序列化時成員必須存在。 // // 返回結果: // 如果該成員是必需的,則為 true;否則為 false。 // // 異常: // System.Runtime.Serialization.SerializationException: // 該成員不存在。 public bool IsRequired { get { return isRequired; } set { isRequired = value; } } // 摘要: // 擷取或設定一個值,該值指定是否對正在被序列化的欄位或屬性的預設值進行序列化。 // // 返回結果: // 如果應該在序列化流中產生成員的預設值,則為 true;否則為 false。 預設值為 true。 public bool EmitDefaultValue { get { return emitDefaultValue; } set { emitDefaultValue = value; } } }}
DataMemberAttribute
從上面應用在DataMemberAttribute上的AttributeUsageAttribute特性來看,該特性只能應用在欄位和屬性上。因為只有這兩種元素才是“資料”成員。4個屬性分別表示如下的含義。
Name:資料成員的名稱,預設為欄位或屬性的名稱。
Order:相應的資料成員在最終序列化的XML中出現的位置,Order值越小越考前,預設值為-1.
IsRequired:表明屬性成員是否是必須的成員。預設值為false,表明該成員是可以預設的。
EmitDefaultValue :擷取或設定一個值,該值指定是否對正在被序列化的欄位或屬性的預設值進行序列化。如果應該在序列化流中產生成員的預設值,則為 true;否則為 false。 預設值為 true。
原始碼來源:點擊開啟連結
以上就是C# WCF DataContractSerializer 類的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!