C# WCF DataContractSerializer 類

衣舞晨風發表於2015-09-14

     原文地址:點選開啟連結 

     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。
原始碼來源:點選開啟連結

相關文章