Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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см. в разделе "Экспорт схем из классов".