新手必看WCF集合契約等價案例分析
經過長時間學習WCF,也經常在網上收集資料,于是和大家分享一下關于WCF集合契約等價,在WCF中應用了CollectionDataContractAttribute屬性的集合稱之為定制數據契約集合,否則為非定制數據契約集合。不管是非定制數據契約集合還是定制數據契約集合,只要它們的數據契約名稱和循環元素的名稱都相同(如果是字典集合其Key和Value也要是相同的),我們就說它們是等價的。
由于非定制數據契約集合的數據契約以及循環元素的名稱由集合中的類型決定,所以非定制數據契約WCF集合契約等價遵守以下幾個規則WCF Data Contract之WCF集合契約等價:
◆相同類型的列表集合被認為具有相同的數據契約(協定)例如:List<int>和int[]是等價的。
◆具有相同相同鍵和值類型的所有字典集合也被視為具有相同的數據契約(協定)
◆接口和實現該接口的具體集合類的數據契約是等價的。例如IList<int>和List<int>等價。
◆非泛型集合與Object類型的泛型WCF集合契約等價等價。例如:List<Object>與ArrayList等價,ArrayList與Object[]也是等價的。
這就是為什么上面的示例中,實現IList<int>和ICollection<int>的集合類型的數據契約名稱都是ArrayOfint的原因。例如下面兩個數據契約是等價的:
- [DataContract(Name="Customer")] public class Customer1
- {
- [DataMember] public string customerName;
- [DataMember] public Collection<string> addresses;
- [DataMember] public string[] telephones;
- }
- [DataContract(Name="Customer")] public class Customer2
- {
- [DataMember] public string customerName;
- [DataMember] public ICollection<string> addresses;
- [DataMember] public List<string> telephones;
- }
#T#注意:Collection<string>和ICollection<string>是等價的,同時string[]和List<string>也是等價的。所以,針對Customer2的定義,我們可以將實現ICollection<string>接口的任何集合類的實例賦給addresses。同樣,我們也可以利用在數據契約中定義集合接口的機制來將WCF不支持的集合類型(如:ReadOnlyCollection,具體見本文中WCF中對集合類型的要求限制一節)來應用到我們的WCF應用中。也就是說我們可以將ReadOnlyCollection的實例賦給Customer2的addresses.