Типы XML и ADO.NET в контрактах данных
Модель контракта данных Windows Communication Foundation (WCF) поддерживает определенные типы, представляющие XML напрямую. При сериализации данных типов в XML сериализатор сохраняет содержимое таких типов XML без какой-либо дополнительной обработки. Поддерживаемые типы: XmlElement, массивы XmlNode (но не сами типы XmlNode
), а также типы, реализующие IXmlSerializable. Типы DataSet и DataTable, а также типизированные наборы данных, чаще всего используются в программировании баз данных. Данные типы реализуют интерфейс IXmlSerializable
, и, следовательно, сериализуются в модели контракта данных. Некоторые специальные рекомендации, относящиеся к данным типам, приведены в конце данного раздела.
Типы XML
Элемент XML
Тип XmlElement
сериализуется с помощью содержимого XML. Например, с помощью следующего типа.
[DataContract(Namespace=@"http://schemas.contoso.com")]
public class MyDataContract
{
[DataMember]
public XmlElement myDataMember;
public void TestClass()
{
XmlDocument xd = new XmlDocument();
myDataMember = xd.CreateElement("myElement");
myDataMember.InnerText = "myContents";
myDataMember.SetAttribute
("myAttribute","myValue");
}
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
<DataMember()> _
Public myDataMember As XmlElement
Public Sub TestClass()
Dim xd As New XmlDocument()
myDataMember = xd.CreateElement("myElement")
myDataMember.InnerText = "myContents"
myDataMember.SetAttribute("myAttribute", "myValue")
End Sub
End Class
Данный тип сериализуется в XML следующим образом:
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
Обратите внимание, что элемент данных программы-оболочки <myDataMember>
все еще присутствует. Удалить данный элемент в модели контракта данных невозможно. Сериализаторы, обрабатывающие данную модель (DataContractSerializer и NetDataContractSerializer), могут выдать специальные атрибуты в данный элемент программы-оболочки. Данные атрибуты включают атрибут "nil" экземпляра схемы XML (позволяющий XmlElement
принимать значение null
) и атрибут "type" (позволяющий использовать XmlElement
полиморфно). Кроме того, следующие атрибуты XML относятся к WCF: "Id", "Ref", "Type" и "Assembly". Данные атрибуты могут быть выданы для поддержки использования элемента XmlElement
в режиме сохранения графов объектов или при обработке сериализатором NetDataContractSerializer. (Дополнительные сведения о режиме сохранения графа объектов см. в разделе Сериализация и десериализация.)
Массивы коллекций XmlElement
разрешены и обрабатываются так, как и любой другой массив или коллекция. Есть элемент программы-оболочки для всей коллекции и отдельный элемент программы-оболочки (подобный <myDataMember>
из предыдущего примера) для каждого элемента XmlElement
в массиве.
При десериализации элемент XmlElement
создается с помощью десериализатора из входящего кода XML. Допустимый родительский XmlDocument предоставляется десериализатором.
Убедитесь, что фрагмент XML, из которого десериализуется элемент XmlElement
, определяет все префиксы, которые он использует, и не применяет какие-либо определения префикса из предков. Такая проблема возникает только при использовании DataContractSerializer
для доступа к XML из отличного (не DataContractSerializer
) источника.
При использовании с DataContractSerializer
XmlElement
ним может быть назначен полиморфно, но только элементу данных типаObject. Даже несмотря на то, что он реализует IEnumerable, XmlElement
не может быть использован как тип коллекции и не может быть назначен элементу данных IEnumerable. Как и во всех полиморфных назначениях, он DataContractSerializer
выдает имя контракта данных в результирующем XML. В этом случае это "XmlElement" в http://schemas.datacontract.org/2004/07/System.Xml
пространстве имен.
С NetDataContractSerializer
поддерживается любое допустимое полиморфное назначение XmlElement
(в Object
или IEnumerable
).
Не пытайтесь использовать ни один из сериализаторов для типов, унаследованных от XmlElement
, независимо от того, полиморфно они назначены или нет.
Массив типа XmlNode
Использование массивов XmlNode очень похоже на использование XmlElement
. Использование массивов XmlNode
обеспечивает большую гибкость, чем использование XmlElement
. Можно записать несколько элементов внутри элемента программы-оболочки элемента данных. Кроме того, можно вставить содержимое, которое отличается от элементов внутри элемента программы-оболочки элемента данных, например комментарии XML. И наконец, в элемент программы-оболочки элемента данных можно поместить атрибуты. Все это можно сделать путем указания массива XmlNode
со специальными унаследованными классами XmlNode
, такими как XmlAttribute, XmlElement
или XmlComment. Например, с помощью следующего типа.
[DataContract(Namespace="http://schemas.contoso.com")]
public class MyDataContract
{
[DataMember]
public XmlNode[] myDataMember = new XmlNode[4];
public void TestClass()
{
XmlDocument xd = new XmlDocument();
XmlElement xe = xd.CreateElement("myElement");
xe.InnerText = "myContents";
xe.SetAttribute
("myAttribute","myValue");
XmlAttribute atr = xe.Attributes[0];
XmlComment cmnt = xd.CreateComment("myComment");
myDataMember[0] = atr;
myDataMember[1] = cmnt;
myDataMember[2] = xe;
myDataMember[3] = xe;
}
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
<DataMember()> _
Public myDataMember(3) As XmlNode
Public Sub TestClass()
Dim xd As New XmlDocument()
Dim xe As XmlElement = xd.CreateElement("myElement")
xe.InnerText = "myContents"
xe.SetAttribute("myAttribute", "myValue")
Dim atr As XmlAttribute = xe.Attributes(0)
Dim cmnt As XmlComment = xd.CreateComment("myComment")
myDataMember(0) = atr
myDataMember(1) = cmnt
myDataMember(2) = xe
myDataMember(3) = xe
End Sub
End Class
При сериализации получаемый код XML подобен приведенному ниже коду.
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember myAttribute="myValue">
<!--myComment-->
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
Обратите внимание, что элемент программы-оболочки элемента данных <myDataMember>
включает атрибут, комментарий и два элемента. Это четыре сериализированные экземпляра XmlNode
.
Массив XmlNode
, который получается в недопустимом XML-коде, не может быть сериализован. Например, массив из двух экземпляров XmlNode
, из которых один - XmlElement
, а другой - XmlAttribute, является недействительным, поскольку данная последовательность не соответствует какому-либо допустимому экземпляру XML (в нем нет места, чтобы вложить атрибут).
При десериализации массива XmlNode
узлы создаются и заполняются информацией из входящего XML-кода. Допустимый родительский XmlDocument предоставляется десериализатором. Все узлы десериализуются, включая любые атрибуты элемента-члена данных-оболочки, но исключают атрибуты, помещенные в сериализаторы WCF (например, атрибуты, используемые для указания полиморфного назначения). Примечание об определении всех префиксов пространства имен во фрагменте XML-кода применяется к десериализации массивов XmlNode
точно так же, как при десериализации XmlElement
.
При использовании сериализаторов с включенным режимом сохранения графов объектов равенство объектов сохраняется только на уровне массивов XmlNode
, а не отдельных экземпляров XmlNode
.
Не пытайтесь сериализовать массив XmlNode
, где один или более узлов установлены в значение null
. Значение null
разрешено применять ко всему элементу массива, а не к отдельному XmlNode
, содержащемуся в массиве. Если весь элемент данных массива пуст, элемент данных программы-оболочки содержит специальный атрибут, указывающий, что элемент данных массива пуст. При десериализации весь элемент данных массива также становится пустым.
Специально обрабатываются сериализатором только обычные массивы XmlNode
. Элементы данных, объявленные как другие типы коллекций, содержащие XmlNode
, или элементы данных, объявленные как массивы типов, унаследованных от XmlNode
, специально не обрабатываются. Это означает, что обычно они не сериализуются, кроме случаев, когда они также соответствуют одному из других критериев для сериализации.
Массивы или коллекции массивов XmlNode
разрешены. Есть элемент программы-оболочки для всей коллекции и отдельный элемент программы-оболочки (подобный <myDataMember>
из предыдущего примера) для каждого массива XmlNode
во внешнем массиве или коллекции.
Указание элемента данных типа Array класса Object
или Array
интерфейса IEnumerable
с экземплярами XmlNode
не приводит к обработке элемента данных как экземпляров Array
класса XmlNode
. Каждый элемент данных сериализуется отдельно.
При использовании с DataContractSerializer
массивы XmlNode
могут быть назначены полиморфно, но только элементу данных типа Object
. Даже несмотря на реализацию интерфейса IEnumerable
массив XmlNode
не может быть использован как тип коллекции и не может быть назначен элементу данных IEnumerable
. Как и во всех полиморфных назначениях, DataContractSerializer
он выдает имя контракта данных в результирующем http://schemas.datacontract.org/2004/07/System.Xml
XML- в данном случае это "ArrayOfXmlNode" в пространстве имен. При использовании с NetDataContractSerializer
массивом поддерживается любое допустимое назначение массива XmlNode
.
Замечания по схемам
Дополнительные сведения о сопоставлении схем типов XML см. в справочнике по схеме контракта данных. В данном разделе приводится обзор важных моментов.
Элемент данных типа XmlElement
с элементом, определенным с помощью следующего анонимного типа.
<xsd:complexType>
<xsd:sequence>
<xsd:any minOccurs="0" processContents="lax" />
</xsd:sequence>
</xsd:complexType>
Элемент данных типа массива XmlNode
сопоставлен с элементом, определенным с помощью следующего анонимного типа.
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xsd:sequence>
<xsd:anyAttribute/>
</xsd:complexType>
Типы, реализующие интерфейс IXmlSerializable
Типы, реализующие интерфейс IXmlSerializable
, полностью поддерживаются сериализатором DataContractSerializer
. К данным типам всегда нужно применять атрибут XmlSchemaProviderAttribute, необходимый для управления их схемой.
Существует три разновидности типов, реализующих интерфейс IXmlSerializable
: типы, представляющие производное содержимое; типы, представляющие одиночный элемент; устаревшие типы DataSet.
Типы содержимого используют метод поставщика схемы, заданный атрибутом
XmlSchemaProviderAttribute
. Метод не возвращает значениеnull
, и свойство IsAny атрибута остается в значении по умолчаниюfalse
. Это наиболее распространенное использование типовIXmlSerializable
.Типы элемента используется в том случае, когда тип
IXmlSerializable
должен управлять собственным именем корневого элемента. Чтобы отметить тип как тип элемента, свойство IsAny атрибута XmlSchemaProviderAttribute устанавливается в значениеtrue
, или из метода поставщика схемы возвращается значение null. Наличие метода поставщика схемы является необязательным для типов элементов – вместо имени метода вXmlSchemaProviderAttribute
можно указать null. Однако, еслиIsAny
имеет значениеtrue
и указан метод поставщика схемы, метод должен возвратить значение null.Устаревшие типы DataSet являются типами
IXmlSerializable
, не отмеченными атрибутомXmlSchemaProviderAttribute
. Вместо этого они используют для создания схемы метод GetSchema. Данный шаблон используется для типаDataSet
, и его типизированный набор данных наследует класс в более ранних версиях .NET Framework; в настоящее время он устарел и поддерживается только из соображений совместимости с более ранними версиями. Не используйте данный шаблон и всегда применяйте атрибутXmlSchemaProviderAttribute
к своим типамIXmlSerializable
.
Типы содержимого IXmlSerializable
При сериализации элемента данных соответствующего типа, который реализует IXmlSerializable
и относится к определенному ранее типу содержимого, сериализатор записывает элемент программы-оболочки для элемента данных и передает управление методу WriteXml. Реализация WriteXml может записать любой XML, включая добавление атрибутов в элемент программы-оболочки. После выполнения WriteXml
сериализатор закрывает элемент.
При десериализации элемента данных соответствующего типа, который реализует IXmlSerializable
и относится к определенному ранее типу содержимого, десериализатор устанавливает средство чтения XML на элемент программы-оболочки для элемента данных и передает управление методу ReadXml. Метод должен прочесть весь элемент, включая открывающий и закрывающий теги. Убедитесь, что код ReadXml
обрабатывает случай, когда элемент пуст. Кроме того, реализация ReadXml
не должна использовать элемент программы-оболочки, именованный особым образом. Имя, выбранное сериализатором, может изменяться.
Разрешается полиморфно присваивать типы содержимого IXmlSerializable
, например, элементам данных типа Object. Кроме того, для экземпляров типа разрешено значение null. И наконец, можно использовать типы IXmlSerializable
с включенным режимом сохранения графов объектов и с NetDataContractSerializer. Все эти функции требуют, чтобы сериализатор WCF присоединял определенные атрибуты к элементу-оболочке (nil и type) в пространстве имен экземпляра схемы XML и "Id", "Ref", "Type" и "Assembly" в пространстве имен WCF.
Атрибуты, игнорируемые при реализации ReadXml
Перед передачей управления коду ReadXml
десериализатор проверяет XML-элемент, обнаруживает данные специальные атрибуты XML и работает с ними. Например, если "nil" имеет значение true
, десериализуется значение null, и ReadXml
не вызывается. Если обнаружен полиморфизм, содержимое десериализуется так, как если бы это был другой тип. Вызывается реализация ReadXml
полиморфно назначенного типа. В любом случае, реализация ReadXml
игнорирует данные специальные атрибуты, поскольку они обрабатываются десериализатором.
Замечания по схемам для типов содержимого IXmlSerializable
При экспорте схемы с типом содержимого IXmlSerializable
вызывается метод поставщика схемы. XmlSchemaSet передается в метод поставщика схемы. Метод может добавить любую допустимую схему в набор схем. Набор схем содержит схему, которая уже была известна на момент экспорта схемы. Если метод поставщика схем должен добавить элемент в набор схем, он должен определить, имеется ли в наборе XmlSchema с соответствующим пространством имен. Если это так, метод поставщика схемы должен добавить новый элемент в существующую схему XmlSchema
. В противном случае, метод создает новый экземпляр XmlSchema
. Это важно, если используются массивы типов IXmlSerializable
. Например, если есть тип IXmlSerializable
, который экспортируется как тип "A" в пространстве имен "Б", возможно, что к моменту вызова метода поставщика схем, набор схем уже содержит схему для "Б" для удержания типа "ArrayOfA".
Кроме добавления типов в XmlSchemaSet, метод поставщика схемы для типов содержимого должен возвратить ненулевое значение. Метод может возвратить XmlQualifiedName, указывающий имя типа схемы, которая будет использоваться для заданного типа IXmlSerializable
. Полное имя также служит именем контракта данных и пространством имен для типа. Не разрешается возвращать тип, не существующий в наборе схем, немедленно при возврате метода поставщика. Однако предполагается, что к моменту экспорта всех типов (метод Export вызывается для всех соответствующих типов XsdDataContractExporter и выполняется доступ к свойству Schemas) тип существует в наборе схем. Доступ к свойству Schemas
до того, как были выполнены все соответствующие вызовы Export
, может привести к созданию исключения XmlSchemaException. Дополнительные сведения о процессе экспорта см. в разделе "Экспорт схем из классов".
Метод поставщика схемы также может возвратить тип XmlSchemaType для использования. Тип может быть или не быть анонимным. Если тип анонимный, схема для типа IXmlSerializable
экспортируется как анонимный тип при каждом использовании типа IXmlSerializable
в качестве элемента данных. Тип IXmlSerializable
все еще имеет контракт данных и пространство имен. (Это определяется, как описано в описании Имена контрактов данных, за исключением того, что DataContractAttribute атрибут не может использоваться для настройки имени.) Если он не является анонимным, он должен быть одним из типов в объекте XmlSchemaSet
. Данный случай эквивалентен возврату XmlQualifiedName
типа.
Кроме того, для типа экспортируется глобальное объявление элемента. Если к типу не применен атрибут XmlRootAttribute, то элемент имеет те же имя и пространство имен, что и контракт данных, а его свойство nillable имеет значение true
. Единственным исключением является пространство имен схемы (http://www.w3.org/2001/XMLSchema
). Если контракт данных типа находится в этом пространстве имен, соответствующий глобальный элемент находится в пустом пространстве имен, поскольку запрещено добавлять новые элементы в пространство имен схемы. Если к типу XmlRootAttribute
применен атрибут, глобальное объявление элемента экспортируется с помощью следующих свойств: ElementName, Namespaceи IsNullable. По умолчанию применяются XmlRootAttribute
имя контракта данных, пустое пространство имен и значение "nillable".
Те же правила объявления глобального элемента применяются и к устаревшим типам наборов данных. Важно отметить, что XmlRootAttribute
не может переопределить объявления глобальных элементов, добавленных с помощью пользовательского кода или добавленных в набор схем XmlSchemaSet
с помощью метода поставщика схем или посредством метода GetSchema
для устаревших типов наборов данных.
Типы элемента IXmlSerializable
Типы элементов IXmlSerializable
либо имеют свойство IsAny
, которому присвоено значение true
, либо их метод поставщика схем возвращает значение null
.
Сериализация и десериализация типа элемента очень похожа на сериализацию и десериализацию типа содержимого. Однако есть некоторые важные отличия.
Как правило, реализация
WriteXml
записывает только один элемент (который, конечно, может содержать несколько дочерних элементов). Она не должна записывать атрибуты вне данного одиночного элемента, несколько родственных элементов или смешанное содержимое. Элемент может быть пустым.Реализация
ReadXml
не должна прочитывать элемент программы-оболочки. Как правило, реализация прочитывает один элемент, создаваемый методомWriteXml
.При регулярной сериализации типа элемента (например, как элемента данных в контракте данных) сериализатор, как и в случае с типами содержимого, выводит элемент программы-оболочки до вызова метода
WriteXml
. Однако при сериализации типа элемента на верхнем уровне сериализатор обычно не выводит элемент программы-оболочки в окружение элемента, который выводится методомWriteXml
, кроме случая, когда корневое имя и пространство имен были явно заданы при конструировании сериализатора в конструкторахDataContractSerializer
илиNetDataContractSerializer
. Дополнительные сведения см. в разделе Сериализация и десериализация.При сериализации типа элемента на верхнем уровне без указания корневого имени и пространства имен во время создания WriteStartObject и WriteEndObject обычно не выполняют никаких операций, а WriteObjectContent вызывает
WriteXml
. В данном режиме сериализуемый объект не может иметь значение null и не может быть назначен полиморфно. Кроме того, не может быть включено сохранение графов объектов и не может использоватьсяNetDataContractSerializer
.При десериализации типа элемента на верхнем уровне без указания корневого имени и пространства имен во время построения IsStartObject возвращает значение
true
, если не может найти начало хотя бы одного из элементов. ReadObject с параметромverifyObjectName
, установленным в значениеtrue
, работает таким же образом, как иIsStartObject
перед фактическим считыванием объекта. ЗатемReadObject
передает управление методуReadXml
.
Схема, экспортированная для типов элементов, аналогична схеме для типа XmlElement
, как описано в предыдущем разделе, за исключением того, что метод поставщика схемы может добавлять дополнительную схему в XmlSchemaSet как типы содержимого. Использование атрибута XmlRootAttribute
с типами элемента не разрешено, и для данных типов никогда не выдаются глобальные объявления элемента.
Отличия от XmlSerializer
Сериализатор IXmlSerializable
также понимает интерфейс XmlSchemaProviderAttribute
и атрибуты XmlRootAttribute
и XmlSerializer. Однако есть некоторые отличия в том, как данные атрибуты обрабатываются в модели контракта данных. Сводка важнейших отличий представлена ниже.
Метод поставщика схемы должен быть открытым для использования в
XmlSerializer
, но не должен быть открытым для использования в модели контракта данных.Метод поставщика схемы вызывается, если свойству
IsAny
присвоено значение true в модели контракта данных, но не сXmlSerializer
.Если атрибут
XmlRootAttribute
не присутствует в содержимом или устаревших типах набора данных, сериализаторXmlSerializer
экспортирует глобальное объявление элемента в пустое пространство имени. В модели контракта данных используемым пространством имен обычно является пространство имен контракта данных, как было описано ранее.
Помните об этих отличиях при создании типов, которые используются с обеими технологиями сериализации.
Импорт схемы IXmlSerializable
При импорте схемы, созданной из типов IXmlSerializable
, существует несколько возможностей.
Созданная схема может быть допустимой схемой контракта данных, как описано в справочнике по схеме контракта данных. В таком случае, схема может быть импортирована обычным образом, и создаются обычные типы контракта данных.
Созданная схема может не быть действительной схемой контракта данных. Например, ваш собственный метод поставщика схемы может создать схему, которая включает атрибуты XML, не поддерживаемые в модели контракта данных. В данном случае можно импортировать схему как типы
IXmlSerializable
. Этот режим импорта не включен по умолчанию, но его можно легко включить. Например, при/importXmlTypes
переключении командной строки на средство служебной программы метаданных ServiceModel (Svcutil.exe). Это подробно описано в импорте схемы для создания классов. Обратите внимание, что работать нужно непосредственно с XML собственных экземпляров типа. Кроме того, следует принимать во внимание другую технологию сериализации, поддерживающую широкий диапазон схем - см. раздел, посвященный использованиюXmlSerializer
.Возможно, вам понадобится повторно использовать существующие типы
IXmlSerializable
в прокси, вместо того чтобы создавать новые. В таком случае для указания типа для повторного использования может использоваться функция ссылочных типов, описанная в разделе «Импорт схемы для создания типов». Это соответствует использованию параметра/reference
программы svcutil.exe, указывающего на сборку, которая содержит типы для повторного использования.
Представление произвольного XML в контракте данных
Типы XmlElement
, массив XmlNode
и IXmlSerializable
позволяют вводить производный XML в модель контракта данных. DataContractSerializer
и NetDataContractSerializer
, не нарушая процесса, передают данное содержимое XML в используемое средство записи XML. Однако средства записи XML могут принудительно задать некоторые ограничения на записываемый ими XML. В частности, далее приводится несколько важных примеров.
Записи XML обычно не разрешают объявление XML-документа (например, <?xml version='1.0'?>) в середине написания другого документа. Нельзя взять полный XML-документ и сериализовать его как
Array
элемента данныхXmlNode
. Чтобы сделать это, нужно либо удалить объявление документа, либо использовать для его представления собственную схему кодирования.Все записи XML, предоставленные WCF, отклоняют инструкции по обработке XML (<? ...> ) и определения типов документов (<! ... >), так как они не допускаются в сообщениях SOAP. И, опять же, чтобы обойти данное ограничение, можно использовать собственный механизм кодирования. Если нужно включить их в готовый XML-код, можно написать пользовательский кодировщик, использующий поддерживающие их средства записи XML.
При реализации метода
WriteXml
избегайте вызова метода в средстве записи XML WriteRaw. WCF использует различные кодировки XML (включая двоичные), очень трудно или невозможно использовать таким образом, чтобы результат можно было использоватьWriteRaw
в любой кодировке.При реализации
WriteXml
не используйте WriteEntityRefWriteNmToken методы, неподдерживаемые в журналах XML, предоставляемых WCF.
Использование наборов данных, типизированных наборов данных и таблиц данных
Использование данных типов полностью поддерживается в модели контракта данных. При использовании данных типов необходимо учитывать следующие моменты.
Схема для этих типов (особенно DataSet и его типизированные производные классы) может не взаимодействовать с некоторыми платформами, отличными от WCF, или может привести к плохому использованию при использовании с этими платформами. Кроме того, использование типа
DataSet
может отрицательно влиять на производительность. Наконец, это усложняет создание новой версии вашего приложения в будущем. Рассмотрите вариант использования в ваших контрактах явным образом определенных типов контракта данных вместо типовDataSet
.При импорте схем
DataSet
илиDataTable
важно сделать ссылку на эти типы. С помощью средства командной строки Svcutil.exe это можно сделать, передав имя сборки System.Data.dll в переключатель/reference
. Если импортируется схема типизированного набора данных, необходимо создать ссылку на тип типизированного набора данных. При Svcutil.exe передайте расположение сборки типизированного набора данных коммутатору/reference
. Дополнительные сведения о типах ссылок см. в статье "Импорт схемы для создания классов".
Поддержка типизированных наборов данных в контракте данных ограничена. Типизированные наборы данных могут быть сериализованы и десериализованы, а также могут экспортировать свою схему. Однако импорт схемы контракта данных не способен создать новые типы типизированных наборов данных, поскольку в импорте могут повторно использоваться только уже существующие наборы данных. Можно указать на существующий типизированный набор данных с помощью параметра /r
средства Svcutil.exe. При попытке использовать Svcutil.exe без параметра /r
применительно к службе, которая использует типизированный набор данных, автоматически выбирается альтернативный сериализатор (XmlSerializer). Если нужно использовать DataContractSerializer и создать наборы данных из схемы, можно воспользоваться следующей процедурой: создать типы типизированного набора данных (с помощью средства Xsd.exe с параметром /d
применительно к службе), скомпилировать типы, а затем указать на них с помощью параметра /r
средства Svcutil.exe.