本文提供了此 API 参考文档的补充说明。
将 DataContractAttribute 特性应用于由 DataContractSerializer 在序列化和反序列化操作中使用的类型(类、结构或枚举)。 如果使用 Windows Communication Foundation(WCF)基础结构来发送或接收消息,则还应将 DataContractAttribute 应用于保存及操控消息中发送数据的任何类。 有关数据协定的详细信息,请参阅使用数据协定。
您还必须将 DataMemberAttribute 应用于包含您想要序列化的值的任何字段、属性或事件。 通过应用DataContractAttribute,您可以显式启用DataContractSerializer的序列化和反序列化功能。
谨慎
你可以应用 DataMemberAttribute 到私有字段。 请注意,字段返回的数据(即使为专用数据)已序列化和反序列化,因此可由恶意用户或进程查看或拦截。
有关数据协定的详细信息,请参阅 “使用数据协定”中列出的主题。
数据协定
数据协定是一组字段的抽象说明,其中包含每个字段的名称和数据类型。 数据协定存在于任何单个实现之外,以允许不同平台上的服务进行互作。 只要服务之间传递的数据符合同一协定,所有服务都可以处理数据。 此处理也称为 松散耦合系统。 数据协定也类似于接口,该协定指定如何传递数据,以便应用程序可以处理数据。 例如,数据协定可能会调用名为“Person”的数据类型,该数据类型具有两个文本字段,名为“FirstName”和“LastName”。 若要创建数据协定,请将 DataContractAttribute 应用于类,并将 DataMemberAttribute 应用于任何必须序列化的字段或属性。 序列化后,数据符合隐式内置到类型中的数据协定。
注释
数据协定与其继承行为中的实际接口明显不同。 接口由任何派生类型继承。 当您将 DataContractAttribute 应用于基类时,派生类型不会继承该属性或行为。 但是,如果派生类型具有数据协定,则会序列化基类的数据成员。 但是,您必须在派生类中将 DataMemberAttribute 应用于新的成员,以使其可序列化。
XML 架构文档和 SvcUtil 工具
如果要与其他服务交换数据,则必须描述数据协定。 对于当前版本的 DataContractSerializerXML 架构,可用于定义数据协定。 (其他类型的元数据/说明可用于同一目的。若要从应用程序创建 XML 架构,请使用 ServiceModel 元数据实用工具工具(Svcutil.exe) 和 /dconly 命令行选项。 默认情况下,当工具的输入是程序集时,该工具将生成一组 XML 架构,用于定义该程序集中找到的所有数据协定类型。 相反,还可以使用 Svcutil.exe 工具创建 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。 可以通过设置 Name 和 Namespace 属性来替代默认值。 您还可以通过将 ContractNamespaceAttribute 应用于命名空间来更改命名空间。 当你有一个现有类型可以完全按照要求处理数据,但它具有与数据契约不同的命名空间和类名时,请使用此功能。 通过重写默认值,可以重复使用现有类型,并使序列化数据符合数据协定。
注释
在任何代码中,你可以使用DataContract
这个单词来代替较长的DataContractAttribute。
版本控制
数据协定还可以与其自身的后续版本兼容。 也就是说,当更高版本的协定包含额外的数据时,该数据将存储和返回给未接触的发送方。 为此,请实现 IExtensibleDataObject 接口。
有关版本控制的详细信息,请参阅 数据协定版本控制。