Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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
Wcf 何时使用DataContract和DataMember属性?_Wcf_Datacontractserializer_Datacontract_Datamember - Fatal编程技术网

Wcf 何时使用DataContract和DataMember属性?

Wcf 何时使用DataContract和DataMember属性?,wcf,datacontractserializer,datacontract,datamember,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 Add

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

由于许多程序员都被.NET 3.5 SP1中的
[DataContract]
[DataMember]
属性弄得不知所措,Microsoft让数据契约序列化程序处理所有类,即使没有任何这些属性,也与旧的XML序列化程序非常相似

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

但是:如果不添加这些属性,您将失去许多有用的功能:

  • 如果没有
    [DataContract]
    ,则无法为数据定义XML命名空间
  • 如果没有
    [DataMember]
    ,则无法序列化非公共属性或字段
  • 如果没有
    [DataMember]
    ,则无法定义序列化顺序(
    顺序=
    ),DCS将按字母顺序序列化所有属性
  • 如果没有
    [DataMember]
    ,则无法为属性定义其他名称(
    name=
  • 如果没有
    [DataMember]
    ,则无法定义
    IsRequired=
    或其他有用的属性
  • 如果没有
    [DataMember]
    ,则不能省略某些公共属性-所有公共属性都将由DCS序列化

因此,对于“快速不脏”的解决方案,去掉
[DataContract]
[DataMember]
属性将起作用-但将它们放在数据类中仍然是一个好主意-只是为了更明确地说明您在做什么,为了让自己能够访问所有这些没有它们就无法获得的附加功能…

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

Windows通信基础(WCF)默认使用序列化引擎称为数据契约序列化程序来序列化和反序列化数据(将其转换为XML)。所有.NET Framework原语类型(如整数和字符串)以及某些被视为原语的类型(如DateTime和XmlElement)都可以在不做其他准备的情况下序列化,并被视为具有默认数据约定。许多.NET Framework类型也有现有的数据契约


您可以找到完整的文章

当您从http请求调用时,它也会正常工作,但当您尝试从net.tcp调用时,您会得到所有此类内容

在WCF方面,我们可以通过消息与服务器和客户端通信。为了传输消息,并且从安全角度来看,我们需要以序列化格式生成数据/消息

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

让我详细解释一下:

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

  • XmlSerializer
  • 数据序列化程序
  • NetDataContractSerializer
  • XmlSerializer:-默认顺序与类相同

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

    XmlSerializer:-XML架构非常广泛

    DataContractSerializer/NetDataContractSerializer:-XML架构受约束

    XmlSerializer:-不支持版本控制

    DataContractSerializer/NetDataContractSerializer:-版本控制支持是可能的

    XmlSerializer:-与ASMX的兼容性

    DataContractSerializer/NetDataContractSerializer:-与.NET远程处理的兼容性

    XmlSerializer:-XmlSerializer中不需要属性

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


    所以您使用什么取决于您的需求…

    数据成员属性不是必须添加到序列化数据中的。未添加DataMember属性时,旧的XMLSerializer会序列化数据。添加DataMember可提供有用的属性,如order、name、isrequired,这些属性在其他情况下无法使用

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

    数据协定可以是显式的,也可以是隐式的。int、string等简单类型具有隐式数据约定。用户定义的对象是显式或复杂类型,必须使用[DataContract]和[DataMember]属性为其定义数据约定

    数据合同可定义如下:

    • 它描述了从服务操作传递到服务操作的数据的外部格式

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

    • 它将CLR类型映射到XML模式
    • 它定义了如何序列化和反序列化数据类型。通过连载