C# WCF DataContractSerializer 類

來源:互聯網
上載者:User

原文地址:點擊開啟連結

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)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.