何时使用DataContract和DataMember属性?

sam*_*sam 171 wcf datacontract datamember datacontractserializer

DataContract对WCF中的属性非常困惑.据我所知,它用于序列化类似用户定义的类型.我写了一个类,这个类在客户端公开.

[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; }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是当我删除DataContract并且DataMember它也工作正常.我无法理解为什么它正常工作.谁能告诉我实际用途是DataContract什么?

我的服务合同是这样的

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 348

由于很多程序员都不知所措的[DataContract][DataMember]属性,使用.NET 3.5 SP1中,微软对数据合同串行处理所有的类-即使没有任何这些属性的-就像旧的XML序列化.

因此,作为.NET 3.5 SP1,您不添加数据合同或数据成员属性了-如果你不那么数据契约序列化器将序列化所有的公共属性的类,就像XML序列化会.

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

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

因此,对于一个"quick'n'dirty"解决方案,省去[DataContract][DataMember]属性将起作用 - 但是将它们放在数据类上仍然是一个好主意 - 只是为了更清楚地了解你正在做什么,并给自己访问除了它们之外你没有得到的所有其他功能......

  • @Arthis:这不完全正确.从.NET 3.5 SP1开始,WCF将很乐意**序列化类,而不需要**任何**`[DataContract]`和`[DataMember]`属性......但是一旦你开始使用其中一个属性,那么这个"默认"行为将停止工作 - 只要你的类中有一个*single*`[DataMember]`,从那时起,****只有那些具有此属性的属性将被序列化. (31认同)
  • 又吼!它摇滚!! Merci beaucoup! (6认同)
  • Oohh!谢谢澄清这一点!我会再挖一点吧! (3认同)
  • @Santosh:如果你有一个带有一些公共属性的类,那么这些将被WCF数据契约序列化器序列化,除非你明确地应用[DataContract]/[DataMember] .-然后100%由你来说明什么是序列化的什么不是 (2认同)

Pra*_*ari 13

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

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

让我详细解释一下:

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

  1. XmlSerializer的
  2. DataContractSerializer的
  3. NetDataContractSerializer

XmlSerializer: - 默认顺序与类相同

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

XmlSerializer: - XML Schema非常广泛

DataContractSerializer/NetDataContractSerializer: - XML Schema受到约束

XmlSerializer: - 不可能支持版本控制

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

XmlSerializer: - 与ASMX的兼容性

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

XmlSerializer: - XmlSerializer中不需要属性

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

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


mr.*_*r.b 8

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

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

你可以在这里找到完整的文章.

  • 这一切都是真的很好,但它并没有真正回答OP的问题,为什么数据契约序列化器也可以在你的类没有任何[DataContract]和[DataMember]属性的情况下工作.... (2认同)