何时使用DataContract和DataMember属性?

我很关心WCF中的DataContract属性。 据我所知,它被用于类似类的用户定义types的序列化。 我写了一个这样暴露在客户端的类。

 [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; } } 

它正常工作,但是当我删除DataContractDataMember它也能正常工作。 我不明白为什么它正常工作。 任何人都可以告诉我DataContract的实际用途是什么?

我的服务合同是这样的

 [ServiceContract] public interface IRestServiceImpl { [OperationContract] Contact XmlData(string id); } 

由于许多程序员被.NET 3.5 SP1中的[DataContract][DataMember]属性所淹没,Microsoft使得数据协定序列化程序处理所有类 – 即使没有这些属性 – 就像旧的XML序列化程序一样。

因此从.NET 3.5 SP1开始,您不必再添加数据合约或数据成员属性 – 如果您不这样做,那么数据协定序列化程序就会像您的XML序列化程序那样序列化您的类上的所有公共属性。

然而,通过不添加这些属性,你会失去很多有用的function:

  • 没有[DataContract] ,你不能为你的数据定义一个XML命名空间
  • 如果没有[DataMember] ,则无法序列化非公共属性或字段
  • 如果没有[DataMember] ,则无法定义序列化顺序( Order= ),DCS将按字母顺序排列所有属性
  • 如果没有[DataMember] ,则无法为属性定义不同的名称( Name=
  • 没有[DataMember] ,你不能定义IsRequired=或其他有用的属性
  • 如果没有[DataMember] ,则不能遗漏某些公共属性 – 所有公共属性都将由DCS序列化

所以对于一个“quick'n'dirty”解决scheme来说,将[DataContract][DataMember]属性放在[DataMember]就行不通 – 但把它们放在你的数据类上还是一个好主意 – 只是为了更清楚地知道你是什么做,并让自己获得所有那些你没有得到的附加function。

就WCF而言,我们可以通过消息与服务器和客户端进行通信。 为了传递信息,从安全的angular度来看,我们需要以一种序列化的格式制作一个数据/信息。

为了序列化数据,我们使用[datacontract]和[datamember]属性。 在你的情况下,如果你使用datacontract WCF使用DataContractSerializer否则WCF使用默认序列化技术的XmlSerializer

让我详细解释一下:

基本上WCF支持3种序列化:

  1. XmlSerializer的
  2. DataContractSerializer的
  3. NetDataContractSerializer

XmlSerializer : – 默认顺序和class相同

DataContractSerializer / NetDataContractSerializer : – 默认顺序是按字母顺序

XmlSerializer :XML模式是广泛的

DataContractSerializer / NetDataContractSerializer : – XML模式受到约束

XmlSerializer : – 版本支持不可能

DataContractSerializer / NetDataContractSerializer : – 版本支持是可能的

XmlSerializer :与ASMX兼容

DataContractSerializer / NetDataContractSerializer :与.NET Remoting的兼容性

XmlSerializer : – 属性在XmlSerializer中不是必需的

DataContractSerializer / NetDataContractSerializer : – 此序列化中所需的属性

所以你用什么取决于你的要求…

数据合同是服务和客户之间的正式协议,抽象地描述要交换的数据。 也就是说,要进行交stream,客户和服务不必共享相同的types,只有相同的数据合同。 数据契约为每个参数或返回types精确地定义了什么数据被序列化(变成XML)以便交换。

Windows Communication Foundation(WCF)默认使用名为Data Contract Serializer的序列化引擎来序列化和反序列化数据(将其转换为XML)。 所有.NET Framework基元types(如整数和string)以及被视为基元的某些types(如DateTime和XmlElement)都可以进行序列化,而无需其他准备工作,并被视为具有默认数据协定。 许多.NET Frameworktypes也有现有的数据合同。

你可以在这里find完整的文章。

另外,当你从http请求调用它将正常工作,但是当你尝试从net.tcp调用那个时候你得到所有这种东西

DataMember属性不是强制添加到序列化数据。 未添加DataMember属性时,旧的XMLSerializer将序列化数据。 添加DataMember提供了有用的属性,如order,name,isrequired,否则不能使用。

数据合同是服务和客户之间的正式协议,抽象地描述要交换的数据。

数据契约可以是明示的也可以是隐含的。 简单types如int,string等有一个隐含的数据契约。 用户定义的对象是显式的或复杂的types,您必须使用[DataContract]和[DataMember]属性为其定义数据协定。

数据合同可以定义如下:

  • 它描述了传入和传出服务操作的数据的外部格式

  • 它定义了在服务消息中交换的数据的结构和types

  • 它将CLRtypes映射到XML模式
  • 它定义了数据types是如何序列化和反序列化的。 通过串行化,将对象转换为可以通过networking传输的字节序列。 通过反序列化,您可以从调用应用程序接收到的一系列字节中重组对象。
  • 这是一个版本控制系统,允许您pipe理对结构化数据的更改

我们需要将System.Runtime.Serialization引用包含到项目中。 该程序集包含DataContract和DataMember属性。