架构导入和导出

Windows Communication Foundation (WCF) 包括新序列化引擎 DataContractSerializerDataContractSerializer 在 .NET Framework 对象和 XML 之间进行转换(双向)。除了序列化程序本身,WCF 还包括关联的架构导入和架构导出机制。“架构”**是对序列化程序生成的或反序列化程序可以访问的 XML 形状的进行正式、精确、计算机可读的说明。WCF 使用万维网联合会 (W3C) XML 架构定义语言 (XSD) 作为其架构表示形式,这种语言可与众多第三方平台广泛进行互操作。

架构导入组件 XsdDataContractImporter 使用 XSD 架构文档并生成 .NET Framework 类(通常为数据协定类),使序列化格式对应于给定架构。

例如,以下架构片段:

<xs:complexType name="Vehicle">
  <xs:sequence>
    <xs:element name="year" type="xs:int" />
    <xs:element name="color" type="xs:string" />
  </xs:sequence>
</xs:complexType>

生成以下类型(略经简化以便于阅读)。

Partial Class Vehicle
    Implements IExtensibleDataObject

    Private yearField As Integer
    Private colorField As String
    
    <DataMember()>  _
    Public Property year() As Integer 
        Get
            Return Me.yearField
        End Get
        Set
            Me.yearField = value
        End Set
    End Property
    
    <DataMember()>  _
    Public Property color() As String 
        Get
            Return Me.colorField
        End Get
        Set
            Me.colorField = value
        End Set
    End Property 
    Private extensionDataField As ExtensionDataObject
    
    Public Property ExtensionData() As ExtensionDataObject _
        Implements IExtensibleDataObject.ExtensionData
        Get
            Return Me.extensionDataField
        End Get
        Set (ByVal value As ExtensionDataObject)
            Me.extensionDataField = value
        End Set
    End Property
End Class 
[DataContract]
public partial class Vehicle : IExtensibleDataObject
{
    private int yearField;
    private string colorField;

    [DataMember] public int year {
        get {return this.yearField;}
        set {this.yearField=value;}
    }
[DataMember] public string color{
        get {return this.colorField;}
        set {this.colorField=value;}
    }
    
    private ExtensionDataObject extensionDataField;
    public ExtensionDataObject ExtensionData {
        get {return this.extensionDataField;}
        set {this.extensionDataField=value;}
    }
}

请注意,生成的类型遵循多种数据协定最佳做法(请参见最佳做法:数据协定版本管理):

  • 此类型实现 IExtensibleDataObject 接口。有关更多信息,请参见 向前兼容的数据协定.

  • 数据成员作为封装私有字段的公共属性来实现。

  • 此类是一个分部类,不修改生成的代码就可以添加内容。

XsdDataContractExporter 使您能够进行反向操作,使用可用 DataContractSerializer 进行序列化的类型并生成 XSD 架构文档。

不保证保真

不保证进行往返行程的架构或类型完全保真。(“往返行程”**是指导入架构以创建一组类,并导出结果以重新创建架构。)可能不会返回相同的架构。反向过程也不保证保真。(导出类型以生成其架构,然后重新导入此类型。不太可能返回相同的类型。)

支持的类型

数据协定模型只支持有限的 WC3 架构子集。导入过程中任何不符合此子集的架构都将导致异常。例如,没有办法可以指定数据协定的数据成员应该作为 XML 属性进行序列化。这样,由于不能用正确的 XML 投影生成数据协定,需要使用 XML 属性的架构将不受支持,并且将在导入过程中导致异常。

例如,不能使用默认导入设置导入以下架构片段。

<xs:complexType name="Vehicle">
  <xs:sequence>
    <xs:element name="year" type="xs:int" />
    <xs:element name="color" type="xs:string" />
  </xs:sequence>
  <xs:attribute name="engineHorsePower" type="xs:int" />
</xs:complexType>

有关更多信息,请参见 数据协定架构参考. 如果架构不符合数据协定规则,请使用另一个序列化引擎。例如,XmlSerializer 使用自己的独立架构导入机制。另外,有一个扩展了所支持的架构范围的特殊导入模式。有关更多信息,请参见导入架构以生成类中有关生成 IXmlSerializable 类型一节。

XsdDataContractExporter 支持可以用 DataContractSerializer 序列化的任何 .NET Framework 类型。有关更多信息,请参见 数据协定序列化程序支持的类型. 请注意,使用 XsdDataContractExporter 生成的架构通常是 XsdDataContractImporter 可以使用的有效数据(除非 XmlSchemaProviderAttribute 用于对架构进行自定义)。

有关使用 XsdDataContractImporter 的更多信息,请参见导入架构以生成类

有关使用 XsdDataContractExporter 的更多信息,请参见从类导出架构

另请参见

参考

DataContractSerializer
XsdDataContractImporter
XsdDataContractExporter

概念

导入架构以生成类
从类导出架构