首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 泛型與集合資料契約(下):IEnumerable/IList、自訂集合契約、字典序列化與 VS 導入客製化

     編輯:關於.NET

承上篇泛型資料契約,本文聚焦集合型別的序列化規則、自訂集合契約(CollectionDataContractAttribute)、字典型別處理,以及 Visual Studio 服務參考導入時的集合型別客製化選項。

一、IEnumerable<T>、Array、IList<T>:等效序列化規則

三者序列化結果完全一致:根節點 ArrayOf{ElementType},命名空間沿用元素契約,元素按契約序列化。預設導入 Client 端皆轉為陣列 T[]。

VS 導入客製化: 「加入服務參考」→「進階」→「集合類型」可選:Array、ArrayList、LinkedList、GenericList(List<T>)、Collection、BindingList。選 GenericList 後導入介面參數型別皆為 List<Customer>。

二、非泛型 IEnumerable、IList:需 KnownType 支援

元素型別不可知,序列化根節點為 ArrayOfanyType,元素節點 anyType,含 i:type 指定實際型別。必須將潛在元素型別加入 DataContractSerializer 的 knownTypes,否則失敗。導入 Client 端轉為 object[],同樣可透過 VS 設定改為 List<object>。

三、自訂集合資料契約:CollectionDataContractAttribute

繼承 List<T> 或實作 IEnumerable<T> 並具備:

  • 預設無參建構函數:反序列化時透過反射建立實例,缺少則拋 InvalidDataContractException
  • Add(T) 方法:反序列化時逐項加入,缺少同樣拋異常

CollectionDataContractAttribute 可自訂:

  • Name、Namespace:契約名稱/空間
  • ItemName:元素節點名稱(預設元素契約名)
  • KeyName、ValueName:字典型集合的 Key/Value 節點名

範例: CustomerCollection 設定 Name="CustomerList"、ItemName="CustomerEntry",輸出 <CustomerList><CustomerEntry>...。

四、字典型別:IDictionary<TKey,TValue>、Hashtable、自訂字典契約

元素為 KeyValuePair<TKey,TValue>。泛型字典根節點含型別哈希值(如 ArrayOfKeyValueOfguidCustomer2af2CULK);Hashtable 為 ArrayOfKeyValueOfanyTypeanyType。導入 Client 端:Hashtable→Dictionary<object,object>,泛型字典保留泛型參數。

VS 字典集合類型選項更豐富:Dictionary、Hashtable、SortedList、GenericDictionary 等。

自訂字典契約: 繼承 Dictionary<TKey,TValue> 標註 CollectionDataContract 設定 ItemName、KeyName、ValueName,輸出清晰語意化 XML:<CustomerCollection><CustomerEntry><CustomerID>...<Customer>...。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved