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

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. Дополнительные сведения о создании контрактов данных, обладающих прямой совместимостью, см. в разделе Контракты данных, совместимые с любыми будущими изменениями.

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

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

Класс 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см. в разделе "Экспорт схем из классов".

См. также