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


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

Windows Communication Foundation (WCF) включает новый механизм сериализации — DataContractSerializer. Объект DataContractSerializer осуществляет преобразование объектов .NET Framework в формат XML и обратно. Помимо собственно сериализатора WCF включает связанные механизмы импорта и экспорта схемы. Схема — это формальное, точное и обрабатываемое компьютером описание формата XML-данных, которые создаются сериализатором или могут использоваться десериализатором. WCF использует в качестве представления схемы язык определения схемы XML (XSD) консорциума W3C, который поддерживает взаимодействие с большим числом сторонних платформ.

Компонент импорта схемы 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;}
    }
}

Обратите внимание, что созданный тип соответствует нескольким рекомендациям по созданию контрактов данных (см. Рекомендации. Управление версиями контракта данных).

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

См. также

Справочник

DataContractSerializer
XsdDataContractImporter
XsdDataContractExporter

Основные понятия

Импорт схемы для создания классов
Экспорт схем из классов