我对WCF中的DataContract
属性感到非常困惑。据我所知,它用于序列化类似用户定义的类型。我写了一个在客户端暴露的课程。
[DataContract]
public class Contact
{
[DataMember]
public int Roll { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Address { get; set; }
[DataMember]
public int Age { get; set; }
}
它工作正常,但当我删除DataContract
和DataMember
时,它也能正常运行。我无法理解为什么它正常工作。任何人都可以告诉我DataContract
的实际用途是什么吗?
我的服务合同是这样的
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
Contact XmlData(string id);
}
答案 0 :(得分:333)
由于很多程序员都被[DataContract]
和[DataMember]
属性所淹没,使用.NET 3.5 SP1,Microsoft使数据契约序列化程序处理所有类 - 即使没有任何属性 - 就像旧的XML序列化器。
从.NET 3.5 SP1开始,您不再必须添加数据协定或数据成员属性 - 如果不这样做,那么数据协定序列化程序将序列化您的所有公共属性class,就像XML序列化器一样。
HOWEVER:,如果不添加这些属性,就会失去很多有用的功能:
[DataContract]
,您无法为您的数据定义XML命名空间[DataMember]
,您无法序列化非公共属性或字段[DataMember]
,您无法定义序列化顺序(Order=
),DCS将按字母顺序序列化所有属性[DataMember]
,您无法为您的媒体资源定义其他名称(Name=
)[DataMember]
,您无法定义IsRequired=
或其他有用属性[DataMember]
,您不能遗漏某些公共财产 - 所有公共财产都将由DCS序列化因此,对于“quick'n'dirty”解决方案而言,遗漏[DataContract]
和[DataMember]
属性是可行的 - 但将它们放在数据类上仍然是一个好主意 - 只是为了更明确地了解你正在做什么,并让自己访问所有那些你没有得到的额外功能......
答案 1 :(得分:12)
就WCF而言,我们可以通过消息与服务器和客户端进行通信。为了传输消息,从安全角度来看,我们需要以序列化格式制作数据/消息。
为了序列化数据,我们使用[datacontract]和[datamember]属性。
在您的情况下,如果您使用datacontract
WCF使用DataContractSerializer
,则WCF使用XmlSerializer
这是默认的序列化技术。
让我详细解释一下:
基本上WCF支持3种类型的序列化:
XmlSerializer : - 默认顺序与类
相同DataContractSerializer / NetDataContractSerializer : - 默认顺序为按字母顺序排列
XmlSerializer : - XML Schema是广泛的
DataContractSerializer / NetDataContractSerializer : - XML架构受到约束
XmlSerializer : - 无法支持版本控制
DataContractSerializer / NetDataContractSerializer : - 可以支持版本控制
XmlSerializer : - 与ASMX的兼容性
DataContractSerializer / NetDataContractSerializer : - 与.NET Remoting的兼容性
XmlSerializer : - XmlSerializer中不需要属性
DataContractSerializer / NetDataContractSerializer : - 此序列化所需的属性
所以你使用的东西取决于你的要求......
答案 2 :(得分:8)
数据协定是服务和客户之间的正式协议,它抽象地描述了要交换的数据。也就是说,为了进行通信,客户端和服务不必共享相同的类型,只需要相同的数据合同。数据协定为每个参数或返回类型精确定义了要交换的序列化(转换为XML)的数据。
Windows Communication Foundation(WCF)默认使用名为Data Contract Serializer的序列化引擎来序列化和反序列化数据(将数据转换为XML或从XML转换)。所有.NET Framework基元类型(例如整数和字符串)以及作为基元(如DateTime和XmlElement)处理的某些类型都可以序列化而无需其他准备工作,并且被视为具有默认数据协定。许多.NET Framework类型也有现有的数据协定。
您可以找到完整的文章here.
答案 3 :(得分:2)
数据合同是服务和客户之间的正式协议,它抽象地描述了要交换的数据。
数据合同可以是明示的也可以是隐含的。简单类型(如int,string等)具有隐式数据协定。用户定义的对象是显式或复杂类型,您必须使用[DataContract]和[DataMember]属性定义数据协定。
数据合同可以定义如下:
它描述了传入和传出服务操作的数据的外部格式
它定义了服务消息中交换的数据的结构和类型
我们需要包含对项目的System.Runtime.Serialization引用。该程序集包含DataContract和DataMember属性。
答案 4 :(得分:2)
数据合同:它指定您的实体类已准备好进行序列化过程。
数据成员:它指定特定字段是数据合同的一部分,并且可以序列化。
答案 5 :(得分:0)
同样当你从http请求调用时它会正常工作,但是当你尝试从net.tcp调用时,你会得到所有这些东西
答案 6 :(得分:0)
DataMember属性不是必须添加到序列化数据。未添加DataMember属性时,旧的XMLSerializer会序列化数据。添加DataMember提供了有用的属性,如order,name,isrequired,否则无法使用。
答案 7 :(得分:0)