什么时候适合使用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 { ... }