System.Runtime.Serialization.DataContractAttribute 类

本文提供了此 API 参考文档的补充说明。

DataContractAttribute 属性应用于由 DataContractSerializer 执行的序列化和反序列化操作中所使用的类型(类、结构或枚举)。 如果使用 Windows Communication Foundation (WCF) 基础结构发送和接收消息,则还应应用于 DataContractAttribute 保存和操作消息中发送的数据的任何类。 有关数据协定的详细信息,请参阅使用数据协定

此外,还必须将 DataMemberAttribute 应用于任何保存您要序列化的值的字段、属性或事件。 通过应用 DataContractAttribute,可以显式启用 DataContractSerializer 来序列化和反序列化数据。

注意

可将 DataMemberAttribute 应用于私有字段。 请注意,字段(即使是私有字段)所返回的数据将被序列化和反序列化,因此恶意用户或进程可以查看或截获这些数据。

有关数据协定的详细信息,请参阅“使用数据协定”中列出的主题。

数据协定

数据协定是一组字段的抽象说明,其中包含每个字段的名称和数据类型。 数据协定存在于任何单个实现的外部,以使不同平台上的服务可以交互操作。 只要在服务之间传递的数据符合同一协定,这些数据就可以由所有服务进行处理。 此处理也称为 松散耦合系统。 此外,数据协定还与接口类似,因为它指定了为使数据可由应用程序进行处理而必须使用的传送方式。 例如,数据协定可以定义一个名为“Person”的数据类型,它有两个文本字段,分别名为“FirstName”和“LastName”。 若要创建数据协定,请将 DataContractAttribute 应用于类并将 DataMemberAttribute 应用于所有必须序列化的字段或属性。 序列化后,数据将符合隐式内置到类型中的数据协定。

注意

在其继承行为方面,数据协定明显不同于实际接口。 接口由任何派生类型继承。 在将 DataContractAttribute 应用于基类时,派生类型不会继承属性或行为。 但是,如果派生类型具有数据协定,则基类的数据成员将被序列化。 不过,若要使派生类中的新成员可序列化,必须向这些成员应用 DataMemberAttribute

XML 架构文档和 SvcUtil 工具

如果要与其他服务交换数据,则必须描述数据协定。 对于 DataContractSerializer 的当前版本,可使用 XML 架构来定义数据协定。 (其他类型的元数据/说明可用于同一目的。若要从应用程序创建 XML 架构,请使用 ServiceModel 元数据实用工具工具(Svcutil.exe)/dconly 命令行选项。 如果该工具的输入为程序集,则默认情况下该工具会生成一组 XML 架构,这些架构定义了该程序集中包含的所有数据协定类型。 反过来,还可使用 Svcutil.exe 工具创建符合以下 XML 架构的需求的 Visual Basic 或 C# 类定义:XML 架构使用可由数据协定表示的构造。 在这种情况下, 不需要 /dconly 命令行选项。

如果 Svcutil.exe 工具的输入为 XML 架构,则默认情况下该工具会创建一组类。 如果对这些类进行检查,您会发现 DataContractAttribute 已经应用。 可以使用这些类创建一个新的应用程序,用来处理必须与其他服务交换的数据。

还可以针对返回 Web 服务描述语言(WSDL)文档的终结点运行该工具,以自动生成代码和配置以创建 Windows Communication Foundation (WCF) 客户端。 所生成的代码包含带有 DataContractAttribute 标记的类型。

重用现有类型

数据协定具有两个基本要求:一个稳定的名称和一个成员列表。 该稳定名称由该协定的命名空间统一资源标识符 (URI) 和本地名称组成。 默认情况下,在将类应用于 DataContractAttribute 类时,它将类名用作本地名称,类的命名空间(前缀为 "http://schemas.datacontract.org/2004/07/")作为命名空间 URI。 可通过设置 NameNamespace 属性来重写这些默认值。 此外,还可通过将 ContractNamespaceAttribute 应用于命名空间来更改命名空间。 当现有类型能够完全根据您的需要处理数据,但其命名空间和类名与数据协定不同时,请使用此功能。 通过重写默认值,可以重用现有类型并使序列化数据符合数据协定。

注意

在任意代码中,都可以用 DataContract 一词来代替较长的 DataContractAttribute

版本控制

数据协定还可以与其自身的后续版本兼容。 也就是说,当协定的后续版本包含额外数据时,已存储并返回给发送方的数据将保持不变。 为此,应实现 IExtensibleDataObject 接口。

有关版本控制的详细信息,请参阅 数据协定版本控制