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

bwe*_*rks 45 c# wcf known-types

阅读MSDN参考后,我仍然对何时使用KnownType属性有疑问.我知道该属性将类型信息传递给序列化程序,但何时需要?当被序列化的类具有基类类型的引用时,是否适合,并且有可以设置为这些引用的上传衍生类?

而且,过度使用属性有什么缺点吗?例如,在前面的示例中,如果序列化类使用KnownType(baseClass)标记,即使存在对该类型的显式引用?

Mar*_*ell 67

[KnownType]需要告诉它有关亚型的信息.使用它的缺点是以下不起作用:

[DataContract]
class Foo {}

[DataContract]
class Bar : Foo {}
Run Code Online (Sandbox Code Playgroud)

使用WCF接口上的方法返回:

public Foo GetFoo() { return new Bar(); }
Run Code Online (Sandbox Code Playgroud)

没有该属性,序列化程序(特别是对于mex /代理生成的类型)将不知道Bar,它将失败.使用属性:

[DataContract, KnownType(typeof(Bar))]
class Foo {}
Run Code Online (Sandbox Code Playgroud)

工作.这仅适用于DataContractSerializer- 以NetDataContractSerializer不同的方式获取类型数据.


Tob*_*oby 7

如果您在架构中使用XSD"继承".

你已经倒退了; KnownTypeAttribute应用于基类,并命名可能作为对基类的引用传递的所有派生类.

例如:

...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
    ...
}
Run Code Online (Sandbox Code Playgroud)


chi*_*emp 6

在序列化非具体类型(如接口或基类)时,必须使用KnownType属性.WCF序列化程序必须知道接口或继承类的所有可能实现.它不知道的任何实现都会导致序列化异常.

在这个SO问题中可以找到一种可能的用法