閱讀MSDN參考後,我仍然有關於何時使用KnownType屬性的問題。我知道該屬性將類型信息傳遞給序列化程序,但是何時需要?當被序列化的類引用了基類類型,並且有可以設置爲這些引用的上投衍生類時,它是否合適?何時適合使用KnownType屬性?
此外,是否存在過度使用該屬性的缺點?例如,在前面的例子中,如果序列化類被標記爲KnownType(baseClass),即使存在對該類型的明確引用?
閱讀MSDN參考後,我仍然有關於何時使用KnownType屬性的問題。我知道該屬性將類型信息傳遞給序列化程序,但是何時需要?當被序列化的類引用了基類類型,並且有可以設置爲這些引用的上投衍生類時,它是否合適?何時適合使用KnownType屬性?
此外,是否存在過度使用該屬性的缺點?例如,在前面的例子中,如果序列化類被標記爲KnownType(baseClass),即使存在對該類型的明確引用?
[KnownType]
發現是需要告訴它的亞型。的不使用它的缺點是,以下將不起作用:
[DataContract]
class Foo {}
[DataContract]
class Bar : Foo {}
與WCF接口的方法,它返回:
public Foo GetFoo() { return new Bar(); }
沒有屬性,序列化(尤其是mex /代理生成類型)將不知道約Bar
,它會失敗。隨着屬性:
[DataContract, KnownType(typeof(Bar))]
class Foo {}
它會工作。這僅適用於DataContractSerializer
- 使用NetDataContractSerializer
您以不同方式獲取類型數據。
當序列化非具體類型(如接口或基類)時,KnownType屬性是必需的。 WCF序列化程序必須知道接口或繼承類的所有可能的實現。任何它不知道的實現都會導致序列化異常。
一個possable使用可以在此SO question
如果您在架構中使用XSD「繼承」。
你已經得到了它; KnownTypeAttribute應用於基類,並將所有可能作爲基準參考傳遞的派生類命名。
例如:
...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
...
}
甜!很好的例子。謝謝! – bwerks 2010-07-02 20:08:56