我正在学习WCF,不了解KnowTypeAttribute的真正优势。有人可以简单地解释一下为什么我们需要它吗?
DataContractSerializer 是基于契约的,这意味着它不依赖于任何特定的类型模型。它拥有的只是数据(通常是 xml)。这意味着如果您有这样的模型:
Customer
SuperCustomer : Customer
AwesomeCustomer : Customer
然后是序列化器需要提前知道每种类型在数据中看到它意味着什么;否则它不知道要创建什么类型。这可以通过多种方式完成,其中最简单的是 KnownTypeAttribute。
考虑替代方案;序列化程序只知道“Customer”,它希望将其视为<customer>...</customer>
在一些xml中。相反,它得到了其他东西(什么并不重要,但我们可以说<superCustomer>...</superCustomer>
。现在它有什么作用?它会开始寻找可能的类型吗?这是非常不精确且有风险的。还要考虑,它需要能够为该数据生成 WSDL/MEX 导出 - 如果它只知道“客户”,则不可能警告调用者也期望 SuperCustomer / AwesomeCustomer - 这意味着 WSDL/MEX是不完整且无用的。
XmlSerializer (XmlIncludeAttribute) 和 protobuf-net (ProtoIncludeAttribute) 使用相同的方法,并且可能是我最常用的方法contract基于序列化器。
另一种选择是type基于序列化器(BinaryFormatter、NetDataContractSerializer 等) - 在此包括数据中的类型, 意义Your.Namespace.Type, Your.Assembly, blah
- 这意味着它不需要提前知道(因为它在数据中是明确的),但也意味着它不能possibly适用于不同的模型(或者实际上是跨平台)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)