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

WCF 序列化核心:已知類型機制、KnownTypeAttribute 與 ServiceKnownTypeAttribute 完整指南

     編輯:關於.NET

DataContractSerializer 序列化/反序列化需預知型別。面向介面編程時,宣告型別(介面/抽象類)與實際執行型別不符,導致「未知型別」序列化失敗。已知類型機制透過將潛在具體型別註冊至序列化器,解決此核心問題。

一、未知型別導致序列化失敗

介面 IOrder、抽象類 OrderBase、具體類 Order。以 IOrder 或 OrderBase 建構 Serializer 序列化 Order 實例,拋 SerializationException:「型別無法識別」。

二、DataContractSerializer 已知類型集合

六個建構函數多載皆接受 IEnumerable<Type> knownTypes,對應唯讀屬性 KnownTypes。輔助方法 Serialize<T>(instance, file, knownTypes) 示範傳入列表。

三、介面 vs 抽象類建構 Serializer 的序列化差異

  • 介面:無法套用 DataContractAttribute,根節點為 <z:anyType i:type="...">,導入 Client 端參數型別變為 object。
  • 抽象類(資料契約):根節點為契約名(<OrderBase i:type="Order">),語意更清晰。

建議服務契約參數使用抽象/具體資料契約型別,避免介面導致的 object 化。

四、聲明式已知類型:KnownTypeAttribute 與 ServiceKnownTypeAttribute

  • [KnownType(typeof(ChildType))]:標註於基底資料契約類別,指定衍生型別。
  • [ServiceKnownType(typeof(Type))]:標註於服務契約介面/方法、服務實作類別/方法。作用域:介面級→所有操作;方法級→單一操作;實作類級→該服務所有方法;實作方法級→單一方法。

五、組態檔配置已知類型

<system.runtime.serialization>
  <dataContractSerializer>
    <declaredTypes>
      <add type="Namespace.BaseType, Assembly">
        <knownType type="Namespace.DerivedType, Assembly" />
      </add>
    </declaredTypes>
  </dataContractSerializer>
</system.runtime.serialization>

與 KnownTypeAttribute 等效,適合不修改代碼、部署階段擴充的場景。

已知類型是 WCF 多型序列化的基石。善用屬性與組態雙重機制,可在保持介面抽象的同時,確保序列化器正確識別具體型別,避免運行時異常。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved