何时使用DataContract和DataMember属性?

时间:2011-01-29 11:49:27

标签: wcf datacontractserializer datacontract datamember

我对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; }
}

它工作正常,但当我删除DataContractDataMember时,它也能正常运行。我无法理解为什么它正常工作。任何人都可以告诉我DataContract的实际用途是什么吗?

我的服务合同是这样的

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

8 个答案:

答案 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种类型的序列化:

  1. XmlSerializer
  2. 的DataContractSerializer
  3. NetDataContractSerializer
  4. 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]属性定义数据协定。

数据合同可以定义如下:

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

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

  • 它将CLR类型映射到XML架构
  • 它定义了数据类型的序列化和反序列化方式。通过序列化,您可以将对象转换为可以通过网络传输的字节序列。通过反序列化,您可以从调用应用程序接收的字节序列中重新组合对象。
  • 这是一个允许您管理结构化数据更改的版本控制系统

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

答案 4 :(得分:2)

  1. 数据合同:它指定您的实体类已准备好进行序列化过程。

  2. 数据成员:它指定特定字段是数据合同的一部分,并且可以序列化。

答案 5 :(得分:0)

同样当你从http请求调用时它会正常工作,但是当你尝试从net.tcp调用时,你会得到所有这些东西

答案 6 :(得分:0)

DataMember属性不是必须添加到序列化数据。未添加DataMember属性时,旧的XMLSerializer会序列化数据。添加DataMember提供了有用的属性,如order,name,isrequired,否则无法使用。

答案 7 :(得分:0)

数据将在服务内传输和处理并存储值,因此在 WCF 术语中,它们被称为“数据契约”。

每个班级成员所在的位置;即,数据契约被称为“Data Member”,它们也需要用属性来修饰。

enter image description here

Source