首页 文章

何时使用DataContract和DataMember属性?

提问于
浏览
158

我对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 的实际用途是什么?

我的服务 Contract 是这样的

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

7 回答

  • 7

    由于许多程序员都被_845754_和 [DataMember] 属性所淹没,使用.NET 3.5 SP1,Microsoft使数据 Contract 序列化程序处理所有类 - 即使没有任何这些属性 - 就像旧的XML序列化程序一样 .

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

    HOWEVER: 通过不添加这些属性,您将失去许多有用的功能:

    • 没有 [DataContract] ,您无法为您的数据定义XML命名空间

    • 没有 [DataMember] ,您无法序列化非公共属性或字段

    • 没有 [DataMember] ,您无法定义序列化顺序( Order= ),DCS将按字母顺序序列化所有属性

    • 没有 [DataMember] ,您无法为您的属性定义其他名称( Name=

    • 没有 [DataMember] ,您无法定义 IsRequired= 之类的内容或其他有用的属性

    • 没有 [DataMember] ,您不能遗漏某些公共 property - 所有公共 property 将由DCS序列化

    因此,对于一个"quick'n'dirty"解决方案,忘掉 [DataContract][DataMember] 属性将会起作用 - 但它仍然在做,并且让自己可以访问除了它们之外没有得到的所有其他功能......

  • 0

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

    For serializing data we use [datacontract] and [datamember] attributes. 在您的情况下如果您使用 datacontract WCF使用 DataContractSerializer 否则WCF使用 XmlSerializer 这是默认的序列化技术 .

    让我详细解释一下:

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

    • XmlSerializer

    • DataContractSerializer

    • NetDataContractSerializer

    XmlSerializer : - 默认顺序与类相同

    DataContractSerializer/NetDataContractSerializer : - 默认顺序为按字母顺序排列

    XmlSerializer : - XML Schema非常广泛

    DataContractSerializer/NetDataContractSerializer : - XML Schema受到约束

    XmlSerializer : - 无法进行版本控制支持

    DataContractSerializer/NetDataContractSerializer : - 可以支持版本控制

    XmlSerializer : - 与ASMX的兼容性

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

    XmlSerializer : - XmlSerializer中不需要属性

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

    所以你使用的东西取决于你的要求......

  • 2

    数据协定是服务和客户之间的正式协议,它抽象地描述要交换的数据 . 也就是说,为了进行通信,客户端和服务不必共享相同的类型,只需要相同的数据 Contract . 对于每个参数或返回类型,数据协定精确定义了要交换的序列化(转换为XML)的数据 .

    Windows Communication Foundation(WCF)默认使用名为Data Contract Serializer的序列化引擎来序列化和反序列化数据(将数据转换为XML或从XML转换) . 所有.NET Framework原语类型(如整数和字符串)以及某些类型(如DateTime和XmlElement)都可以序列化,无需其他准备工作,并被视为具有默认数据协定 . 许多.NET Framework类型也有现有的数据协定 .

    你可以找到完整的文章here.

  • 2

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

    数据 Contract 可以是明确的或隐含的 . 简单类型(如int,string等)具有隐式数据协定 . 用户定义的对象是显式或复杂类型,您必须使用[DataContract]和[DataMember]属性定义数据协定 .

    数据 Contract 可以定义如下:

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

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

    • 它将CLR类型映射到XML架构

    • 它定义了数据类型的序列化和反序列化方式 . 通过序列化,您可以将对象转换为可以通过网络传输的字节序列 . 通过反序列化,您可以从调用应用程序接收的字节序列中重新组合对象 .

    • 这是一个版本控制系统,允许您管理对结构化数据的更改

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

  • 0
    • 数据协定:它指定您的实体类已准备好进行序列化过程 .

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

  • 11

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

  • 318

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

相关问题