什么时候适合使用KnownType属性?

阅读MSDN参考后,我仍然有关于何时使用KnownType属性的问题。 我知道该属性传递types信息到序列化程序,但是什么时候需要? 当被序列化的类引用了一个基类types,并且有可以被设置为那些引用的向上派生类时是否合适?

而且,过度使用这个属性有什么缺点吗? 例如,在前面的例子中,如果序列化类被标记了KnownType(baseClass),即使有一个明确的引用types?

需要[KnownType]来说[KnownType]types。 使用它的缺点是,以下将不起作用:

 [DataContract] class Foo {} [DataContract] class Bar : Foo {} 

用WCF接口上的方法返回:

 public Foo GetFoo() { return new Bar(); } 

如果没有该属性,序列化程序(特别是对于mex /代理生成的types) 将不知道关于Bar ,它会失败。 具有以下属性:

 [DataContract, KnownType(typeof(Bar))] class Foo {} 

工作。 这仅适用于DataContractSerializer – 使用NetDataContractSerializer可以以不同的方式获取types数据。

当序列化非具体types(如接口或基类)时,KnownType属性是必需的。 WCF序列化程序必须知道接口或inheritance类的所有可能的实现。 任何它不知道的实现都会导致序列化exception。

可以在这个SO问题中find一个可用的用法

如果您在架构中使用XSD“inheritance”。

你已经倒过来了; KnownTypeAttribute应用于基类,并将可能作为引用传递给基的所有派生类命名。

例如:

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