DataContractSerializer 序列化/反序列化需預知型別。面向介面編程時,宣告型別(介面/抽象類)與實際執行型別不符,導致「未知型別」序列化失敗。已知類型機制透過將潛在具體型別註冊至序列化器,解決此核心問題。
介面 IOrder、抽象類 OrderBase、具體類 Order。以 IOrder 或 OrderBase 建構 Serializer 序列化 Order 實例,拋 SerializationException:「型別無法識別」。
六個建構函數多載皆接受 IEnumerable<Type> knownTypes,對應唯讀屬性 KnownTypes。輔助方法 Serialize<T>(instance, file, knownTypes) 示範傳入列表。
DataContractAttribute,根節點為 <z:anyType i:type="...">,導入 Client 端參數型別變為 object。<OrderBase i:type="Order">),語意更清晰。建議服務契約參數使用抽象/具體資料契約型別,避免介面導致的 object 化。
[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 多型序列化的基石。善用屬性與組態雙重機制,可在保持介面抽象的同時,確保序列化器正確識別具體型別,避免運行時異常。