Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#客户端中的DataContract和KnowType属性_C#_Wcf_Attributes - Fatal编程技术网

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

C#客户端中的DataContract和KnowType属性,c#,wcf,attributes,C#,Wcf,Attributes,可能重复: 不久前,我们需要在课堂上创建一个C#web客户端,作为项目的一部分。老师指示我们将属性DataContract放在将通过的每个类之上 然后老师告诉我们,如果你有这样的事情: A / \ / \ B C 这不是完全违背多态性的观点吗?为什么一个类应该知道谁继承了这个类?这与C#和多态性没有任何关系;而不是序列化。WCF基础设施需要能够将字节数组之类的东西从线路上移除,并从中创建一个对象。如果类A

可能重复:

不久前,我们需要在课堂上创建一个C#web客户端,作为项目的一部分。老师指示我们将属性
DataContract
放在将通过的每个类之上

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

A / \ / \ B C
这不是完全违背多态性的观点吗?为什么一个类应该知道谁继承了这个类?

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

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


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

WCF序列化程序将继承的概念与多态性的概念区分开来。CLR继承只意味着基类成员自动添加到派生类中,就序列化程序而言,它并不意味着XML文档中两个元素之间存在任何类型的关系。要获得多态性,必须显式地告诉序列化程序派生类的XML表示可以替换基类的XML表示


我个人认为这种区分很方便。有时,我使用CLR继承而不使用
KnownType
,将公共属性添加到类中,而不暗示它们之间存在任何业务关系。

首先,正如Daniel所说,您谈论的是Windows通信基金会(WCF),而不是web

例如,通过装饰类,您告诉客户机有两个类他必须知道才能使用类“A”

[DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A
{
    [DataMember] 
    private SuperClass myProp;
}

public Class B : SuperClass  {}
public Class C : SuperClass  {}

请查看此链接以了解更多信息:

我自己也很想知道这一点。更合理的做法是将B类和C类标记为KnownType(类型(A))。但我很想开悟。+1-很好地补充了@Jay的话!难道这一切都不能通过反射和更多的数据线来完成吗?
[DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A
{
    [DataMember] 
    private SuperClass myProp;
}

public Class B : SuperClass  {}
public Class C : SuperClass  {}