c# - C# 客户端中的 DataContract 和 KnowType 属性

标签 c# wcf attributes

<分区>

Possible Duplicate:
C# WCF: When is it appropriate to use the KnownType attribute?

不久前,我们需要在类里面创建一个 C# 网络客户端作为项目的一部分。老师指导我们把属性DataContract放在每个要传的类上面。

然后老师告诉我们,如果你有这样的事情:

               A
              / \
             /   \
            B     C

you need to write class A in the following way:

[DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A
{
}

这不是完全违背了多态的思想吗?为什么一个类应该知道谁继承了这个类?

最佳答案

这实际上与 C# 和多态性没有任何关系;而不是序列化。 WCF 基础结构需要能够从网络中取出字节数组之类的东西并从中创建一个对象。如果 A 类是 abstract 类型,则无法实例化该对象。该框架需要知道它可能通过线路接收什么类型,以便它可以检查元数据并实例化正确类型的对象。

换句话说,属性不会告诉类任何关于它的继承者的信息(事实上,列表不需要包括所有继承者);这是严格的,因此框架将知道它可以期望被要求构造什么类型。

不过,我要补充一点,添加 DataContractDataMember 属性并不总是必需的。它们适用于您可能希望进行更细粒度控制的场景,例如从序列化中排除公共(public)属性。通常,如果类型是可序列化的,则它可以在没有属性的情况下传递。

关于c# - C# 客户端中的 DataContract 和 KnowType 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12823201/

相关文章:

c# - 观察者模式或数据绑定(bind)

c# - 在 Compact Framework 中使用 WCF 错误

.net - WCF 错误处理和访问类对象

c# - 自定义属性的反射或正则表达式

c# - 为无效属性或属性参数抛出什么异常?

c# - If 语句在组合枚举值上未按预期工作

c# - 如何使用异或运算正确加密jpeg文件

c# - 为什么 Iterator 定义 remove() 操作?

c# - 使用证书运行 WCF 服务时失败

c# - 创建规则以对参数属性强制执行默认值