Импорт и экспорт схемы
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;}
}
}
Обратите внимание, что созданный тип соответствует нескольким рекомендациям по созданию контрактов данных (см. Рекомендации. Управление версиями контракта данных).
Тип реализует интерфейс 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 см. в разделе Экспорт схем из классов.
См. также
Справочник
DataContractSerializer
XsdDataContractImporter
XsdDataContractExporter