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

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

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

См. также раздел