WCF數據契約特性剖析
WCF在開發領域中占據著一個比較重要的地位,我們可以通過本文介紹的關于對WCF數據契約的相關內容來詳細了解一下這方面的相關知識。那么如何才能正確的應用這方面的知識來幫助我們實現功能需求呢?#t#
WCF數據契約就是采用一種廠商中立、平臺無關的形式(XSD)定義了數據的結構,而WCF通過DataContractAttribute和DataMemberAttribute旨在給相應的類型加上一些元數據,幫助DataContractSerializer將相應類型的對象序列化成具有我們希望結構的XML。在客戶端,WCF的服務調用并不完全依賴于某個具體的類型,客戶端如果具有與服務端完全相同的數據契約類型定義,固然***。如果客戶端現有的數據契約類型與發布出來數據契約具有一些差異,我們仍然可以通過DataContractAttribute和DataMemberAttribute這兩個特性使該數據契約與之等效。
簡言之,如果承載相同數據的兩個不同數據契約類型對象最終能夠序列化出相同的XML,那么這兩個數據契約就可以看成是等效的數據契約。等效的數據契約具有相同的契約名稱、命名空間和數據成員,同時要求數據成員出現的先后次序一致。比如,下面兩種形式的WCF數據契約定義,雖然它們的類型和成員命名不一樣,甚至對應成員在各自類型中定義的次序都不一樣,但是由于合理使用了DataContractAttribute和DataMemberAttribute這兩個特性,確保了它們的對象最終序列化后具有相同的XML結構,所以它們是兩個等效的數據契約。
- [DataContract(Namespace = "http://www.artech.com/")]
- public class Customer
- {
- [DataMember(Order=1)]
- public string FirstName
- {get;set;}
- [DataMember(Order = 2)]
- public string LastName
- { get; set; }
- [DataMember(Order = 3)]
- public string Gender
- { get; set; }
- }
- [DataContract(Name = "Customer", Namespace = "http://www.artech.com/")]
- public class Contact
- {
- [DataMember(Name = "LastName", Order = 2)]
- public string Surname
- { get; set; }
- [DataMember(Name = "FirstName", Order = 1)]
- public string Name
- { get; set; }
- [DataMember(Name = "Gender", Order = 3)]
- public string Sex
- { get; set; }
- }
WCF數據契約版本的差異最主要的表現形式是數據成員的添加和刪除。如何保證在數據契約中添加一個新的數據成員,或者是從數據契約中刪除一個現有的數據成員的情況下,還能保證現有客戶端的正常服務調用(對于服務提供者),或者對現有服務的正常調用(針對服務消費者),這是數據契約版本控制需要解決的問題。