2010-07-02 50 views
37

閱讀MSDN參考後,我仍然有關於何時使用KnownType屬性的問題。我知道該屬性將類型信息傳遞給序列化程序,但是何時需要?當被序列化的類引用了基類類型,並且有可以設置爲這些引用的上投衍生類時,它是否合適?何時適合使用KnownType屬性?

此外,是否存在過度使用該屬性的缺點?例如,在前面的例子中,如果序列化類被標記爲KnownType(baseClass),即使存在對該類型的明確引用?

回答

58

[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您以不同方式獲取類型數據。

+1

甜!很好的例子。謝謝! – bwerks 2010-07-02 20:08:56

6

當序列化非具體類型(如接口或基類)時,KnownType屬性是必需的。 WCF序列化程序必須知道接口或繼承類的所有可能的實現。任何它不知道的實現都會導致序列化異常。

一個possable使用可以在此SO question

5

如果您在架構中使用XSD「繼承」。

你已經得到了它; KnownTypeAttribute應用於基類,並將所有可能作爲基準參考傳遞的派生類命名。

例如:

... 
KnownType(typeof(POBoxAddress)) 
KnownType(typeof(StreetAddress)) 
KnownType(typeof(SingleLineAddress)) 
KnownType(typeof(ParsedAddress)) 
public abstract class AddressBase 
{ 
    ... 
}