何时使用数据契约和数据成员属性?

我对 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);
}
152866 次浏览

因为很多程序员都被 [DataContract][DataMember]属性淹没了,所以。NET 3.5 SP1,微软让数据契约序列化程序处理所有类-即使没有任何这些属性-非常像旧的 XML 序列化程序。

现在是这样。NET 3.5 SP1,你不再添加数据合同或数据成员属性-如果你不这样做,那么数据合同序列化程序将序列化所有公共属性在您的类,就像 XML 序列化程序将。

如果不添加这些属性,然而:会失去很多有用的功能:

  • 如果没有 [DataContract],就不能为数据定义 XML 命名空间
  • 如果没有 [DataMember],则不能序列化非公共属性或字段
  • 如果没有 [DataMember],就不能定义序列化顺序(Order=) ,DCS 将按字母顺序序列化所有属性
  • 如果没有 [DataMember],则不能为属性定义不同的名称(Name=)
  • 如果没有 [DataMember],就不能定义像 IsRequired=或其他有用的属性这样的东西
  • 如果没有 [DataMember],就不能忽略某些公共属性——所有公共属性都将由 DCS 序列化

因此,对于一个“快速’n’脏”的解决方案,去掉 [DataContract][DataMember]属性将工作-但仍然是一个好主意,有他们在您的数据类-只是为了更明确地说明你正在做什么,并给自己访问所有这些附加功能,你不得不得到他们..。

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

Windows 通信基金会(WCF)默认情况下使用一个称为数据契约序列化器的序列化引擎对数据进行序列化和反序列化(将其与 XML 进行转换)。全部。NET Framework 基元类型,例如整数和字符串,以及某些被视为基元的类型,例如 DateTime 和 XmlElement,可以在没有其他准备的情况下进行序列化,并被认为具有默认的数据契约。很多。NETFramework 类型还具有现有的数据契约。

您可以找到完整的文章 给你。

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

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

对于序列化数据,我们使用[ dataccontact ]和[ datammember ]属性。 在您的情况下,如果您正在使用 datacontract WCF 使用 DataContractSerializer else WCF 使用 XmlSerializer,这是默认的序列化技术。译注:

让我详细解释一下:

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

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

默认顺序与类相同

默认顺序是字母顺序

XML 模式是可扩展的

XML 模式是受限的

XmlSerializer:-版本支持不可能

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

与 ASMX 的兼容性

与.NET Remoting 兼容

XmlSerializer 中不需要的属性

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

所以你用什么取决于你的需求。

向序列化数据中添加 DataMember 属性并不是强制性的。未添加 DataMember 属性时,旧的 XMLSerializer 将序列化数据。添加 DataMember 提供了有用的属性,如 order、 name 等,这些属性是必需的,否则无法使用。

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

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

数据合同的定义如下:

  • 它描述了传递给服务操作和从服务操作传递过来的数据的外部格式

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

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

我们需要包含对该项目的 System.Runtime.Serialization 引用。此程序集保存 DataContractandDataMember 属性。

  1. 数据契约: 它指定实体类已准备好进行序列化处理。

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

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

其中类的每个成员; 也就是说,数据约定被称为“ 数据成员”,它们也要用 Attritribute 修饰。

enter image description here

翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳