Поделиться через


Импорт и экспорт схемы

Windows Communication Foundation (WCF) включает новый модуль сериализации, DataContractSerializer. DataContractSerializer переводит между объектами .NET Framework и XML (в обоих направлениях). Помимо самого сериализатора WCF включает связанные механизмы импорта схемы и экспорта схем. Схема — это формальное, точное и машиночитаемое описание формы XML, которую сериализатор создает или к которой может получить доступ десериализатор. WCF использует язык определения схемы XML (W3C) всемирного веб-консорциума (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 интерфейс. Дополнительные сведения см. в Forward-Compatible договорах о данных.

  • Члены данных реализуются как общедоступные свойства, которые упаковывают частные поля.

  • Класс является частичным классом, а дополнения можно сделать без изменения созданного кода.

Это 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 поддерживает любые типы .NET Framework, которые могут быть сериализованы при помощи DataContractSerializer. Дополнительные сведения см. в разделе "Типы", поддерживаемые сериализатором контракта данных. Обратите внимание, что схема, созданная с помощью XsdDataContractExporter, как правило, является допустимыми данными, и может быть использована XsdDataContractImporter (если только XmlSchemaProviderAttribute не используется для настройки схемы).

Дополнительные сведения об использовании XsdDataContractImporterсм. в разделе "Импорт схемы для создания классов".

Дополнительные сведения об использовании XsdDataContractExporterсм. в разделе "Экспорт схем из классов".

См. также