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不同的方式获取类型数据.
如果您在架构中使用XSD"继承".
你已经倒退了; KnownTypeAttribute应用于基类,并命名可能作为对基类的引用传递的所有派生类.
例如:
...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
...
}
Run Code Online (Sandbox Code Playgroud)