架构导入和导出

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

架构导入组件 XsdDataContractImporter 使用 XSD 架构文档并生成 .NET Framework 类(通常为数据协定类),使序列化窗体符合给定架构。

例如,以下架构片段:

XsdDataContractImporter importer = new XsdDataContractImporter();
importer.Options.Namespaces.Add(new KeyValuePair<string, string>("http://schemas.contoso.com/carSchema", "Contoso.Cars"));
Dim importer As New XsdDataContractImporter
importer.Options.Namespaces.Add(New KeyValuePair(Of String, String)("http://schemas.contoso.com/carSchema", "Contoso.Cars"))

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

[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; }
    }
}
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

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

  • 此类型实现 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 的详细信息,请参阅从类导出架构

另请参阅