DataContract和DataMember的作用


數據契約(DataContract)里的DataMember特性

 來源於網絡,用於個人收集及備忘

數據契約(DataContract) 服務契約定義了遠程訪問對象和可供調用的方法,數據契約則是服務端和客戶端之間要傳送的自定義數據類型。

一旦聲明一個類型為DataContract,那么該類型就可以被序列化在服務端和客戶端之間傳送。

只有聲明為DataContract的類型的對象可以被傳送,且只有成員屬性會被傳遞,成員方法不會被傳遞。WCF對聲明為DataContract的類型提供更加細節的控制,可以把一個成員排除在序列化范圍以外,也就是說,客戶端程序不會獲得被排除在外的成員的任何信息,包括定義和數據。默認情況下,所有的成員屬性都被排除在外,因此需要把每一個要傳送的成員聲明為DataMember,如下所示。

復制代碼
    [DataContract]
    public class UserInfo

    {
        [DataMember]
        public string UserName { get; set; }

        [DataMember]
        public int Age { get; set; }

        [DataMember]
        public string Location { get; set; }

        public string Zodiac { get; set; }
    }
復制代碼

 

 只有聲明為DataContract的類型的對象可以被傳送,且只有成員屬性會被傳遞,成員方法不會被傳遞。WCF對聲明為DataContract的類型提供更加細節的控制,可以把一個成員排除在序列化范圍以外,也就是說,客戶端程序不會獲得被排除在外的成員的任何信息,包括定義和數據。默認情況下,所有的成員屬性都被排除在外,因此需要把每一個要傳送的成員聲明為DataMember;

上面這段代碼把UserInfo類聲明為DataContract,將UserName、Age、Location這3個屬性聲明為DataMember(數據成員)。Zodiac成員沒有被聲明為DataMember,因此在交換數據時,不會傳輸Zodiac的任何信息

聲明為DataMember的成員也可以自定義客戶端可見的名稱

除了Name和Namespace以外,DataMember還有以下參數,它們的含義分別如下。

(1)IsRequired:值為true時,要求序列化引擎檢查對象是否存在該值;若無,則會有異常拋出。

(2)Order:bool類型值,值為true時,序列化和反序列化過程將會按成員定義的順序進行,這對依賴於成員位置的反序列化過程無比重要。

(3)EmitDefaultvalue:為成員屬性設置一個默認值。

 

   就區別來說:不加的話,默認所有public的屬性都要序列化。

                       但是加的話,只有標注的屬性(或字段)才能序列化,而且即使那個屬性是私有的,一樣可以序列化,不受任何限制。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM