Справочник по схеме контрактов данных
В данном разделе описывается подмножество схемы XML (XSD), используемое DataContractSerializer для описания типов среды CLR, применяемых для сериализации XML.
DataContractSerializer — сопоставления
DataContractSerializer сопоставляет типы CLR с XSD при экспорте метаданных из службы Windows Communication Foundation (WCF), используя конечную точку метаданных или средство Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe). Дополнительные сведения см. в разделе Сериализатор контракта данных.
DataContractSerializer также сопоставляет типы XSD типам среды CLR, когда для доступа к документам WSDL или XSD и создания контрактов данных для служб или клиентов используется Svcutil.exe.
Сопоставление типам CLR с помощью DataContractSerializer может выполняться только для экземпляров схемы XML, удовлетворяющих требованиям, описанным в данном документе.
Уровни поддержки
DataContractSerializer обеспечивает следующие уровни поддержки для данной функции схемы XML:
Поддерживается. Существует явное сопоставление этой функции типам и (или) атрибутам CLR с помощью DataContractSerializer.
Пропускается. Эта функция используется в схемах, импортируемых DataContractSerializer, но не влияет на создание кода.
Запрещено. DataContractSerializer не поддерживает импорт схемы с использованием данной функции. Например, при доступе Svcutil.exe к WSDL посредством схемы, использующей данную функцию, доступ осуществляется с помощью XmlSerializer. Это выполняется по умолчанию.
Общие сведения
Пространство имен схемы описывается в разделе Схема XML. В этом документе используется префикс «xs».
Атрибуты с пространством имен, отличным от пространства имен схемы, игнорируются.
Любые заметки (за исключением описанных в данном документе) игнорируются.
<xs:schema>: атрибуты
Атрибут | DataContract |
---|---|
attributeFormDefault |
Игнорируется. |
blockDefault |
Игнорируется. |
elementFormDefault |
Должен иметь полное имя. Для того чтобы схема поддерживалась DataContractSerializer, все элементы должны иметь полное имя. Это можно сделать путем задания значения qualified для xs:schema/@elementFormDefault или для xs:element/@form при каждом объявлении элемента. |
finalDefault |
Игнорируется. |
Id |
Игнорируется. |
targetNamespace |
Поддерживается и сопоставляется пространству имен контракта данных. Если данный атрибут не определен, используется пустое пространство имен. Не может быть зарезервированным пространством имен https://schemas.microsoft.com/2003/10/Serialization/. |
version |
Игнорируется. |
<xs:schema>: содержимое
Содержание | Схема |
---|---|
include |
Поддерживается. DataContractSerializer поддерживает xs:include и xs:import. Однако при загрузке метаданных из локального файла средство Svcutil.exe ограничивает следование ссылкам xs:include/@schemaLocation и xs:import/@location. В этом случае список файлов схемы должен передаваться по нештатному механизму, а не посредством include; документы схемы, переданные посредством include, не учитываются. |
redefine |
Запрещено. Использование xs:redefine запрещено DataContractSerializer по соображениям безопасности: для x:redefine требуется следовать schemaLocation. В некоторых случаях Svcutil.exe, использующее DataContract, ограничивает применение schemaLocation. |
import |
Поддерживается. DataContractSerializer поддерживает xs:include и xs:import. Однако при загрузке метаданных из локального файла средство Svcutil.exe ограничивает следование ссылкам xs:include/@schemaLocation и xs:import/@location. В этом случае список файлов схемы должен передаваться по нештатному механизму, а не посредством include; документы схемы, переданные посредством include, не учитываются. |
simpleType |
Поддерживается. См. раздел xs:simpleType. |
complexType |
Поддерживается, сопоставляется контрактам данных. См. раздел xs:complexType. |
group |
Игнорируется. DataContractSerializer не поддерживает xs:group, xs:attributeGroup и xs:attribute. Эти объявления игнорируются как дочерние элементы xs:schema, но ссылки на них невозможны из complexType или других поддерживаемых конструкторов. |
attributeGroup |
Игнорируется. DataContractSerializer не поддерживает xs:group, xs:attributeGroup и xs:attribute. Эти объявления игнорируются как дочерние элементы xs:schema, но ссылки на них невозможны из complexType или других поддерживаемых конструкторов. |
element |
Поддерживается. См. «Объявление глобального элемента». |
attribute |
Игнорируется. DataContractSerializer не поддерживает xs:group, xs:attributeGroup и xs:attribute. Эти объявления игнорируются как дочерние элементы xs:schema, но ссылки на них невозможны из complexType или других поддерживаемых конструкторов. |
notation |
Игнорируется. |
Сложные типы — <xs:complexType>
Общие сведения
Каждый сложный тип <xs:complexType> сопоставляется контракту данных.
<xs:complexType>: атрибуты
Атрибут | Схема |
---|---|
abstract |
По умолчанию должен иметь значение false. |
block |
Запрещено. |
final |
Игнорируется. |
id |
Игнорируется. |
mixed |
По умолчанию должен иметь значение false. |
name |
Поддерживается и сопоставляется имени контракта данных. Если в имени имеются точки, выполняется попытка сопоставить тип внутреннему типу. Например, сложный тип с именем A.B сопоставляется контракту данных, который является внутренним типом для типа с именем контракта данных A, но только в том случае, если данный контракт данных существует. Может существовать более одного уровня вложения: например, A.B.C может быть внутренним типом, но только при условии, что и A, и A.B существуют. |
<xs:complexType>: содержимое
Содержание | Схема |
---|---|
simpleContent |
Расширения запрещены. Ограничение разрешено только из anySimpleType. |
complexContent |
Поддерживается. См. «Наследование». |
group |
Запрещено. |
all |
Запрещено. |
choice |
Запрещено. |
sequence |
Поддерживается, сопоставляется членам данных контракта данных. |
attribute |
Запрещено, даже если use="prohibited" (существует одно исключение). Только необязательные атрибуты из стандартного пространства имен сериализации поддерживаются. Они не сопоставляются членам данных в модели программирования контракта данных. В настоящее время только один подобный атрибут имеет значение; он рассматривается в разделе ISerializable. Другие атрибуты игнорируются. |
attributeGroup |
Запрещено. В выпуске WCF v1 DataContractSerializer игнорирует наличие attributeGroup внутри xs:complexType. |
anyAttribute |
Запрещено. |
(пусто) |
Сопоставляется контракту данных, не имеющему элементов данных. |
<xs:sequence> в сложном типе: атрибуты
Атрибут | Схема |
---|---|
id |
Игнорируется. |
maxOccurs |
По умолчанию должен иметь значение 1. |
minOccurs |
По умолчанию должен иметь значение 1. |
<xs:sequence> в сложном типе: содержимое
Содержание | Схема |
---|---|
element |
Каждый экземпляр сопоставляется элементу данных. |
group |
Запрещено. |
choice |
Запрещено. |
sequence |
Запрещено. |
any |
Запрещено. |
(пусто) |
Сопоставляется контракту данных, не имеющему элементов данных. |
Элементы — <xs:element>
Общие сведения
<xs:element> может использоваться в следующих случаях.
Он может использоваться в <xs:sequence>, описывающей элемент данных обычного контракта данных (не коллекции). В этом случае атрибут maxOccurs должен быть равен 1. (Значение 0 недопустимо).
Он может использоваться в <xs:sequence>, описывающей член данных контракта данных коллекции. В этом случае атрибут maxOccurs должен иметь значение больше 1 или unbounded.
Он может использоваться в <xs:schema> в качестве объявления глобального элемента.
<xs:element> при maxOccurs=1 в <xs:sequence> (элементы данных)
Атрибут | Схема |
---|---|
ref |
Запрещено. |
name |
Поддерживается, сопоставляется имени элемента данных. |
type |
Поддерживается, сопоставляется типу члена данных. Дополнительные сведения см. в разделе «Сопоставление тип-примитив». Если не задан (и элемент не содержит анонимный тип), предполагается xs:anyType. |
block |
Игнорируется. |
default |
Запрещено. |
fixed |
Запрещено. |
form |
Должен иметь полное имя. Этот атрибут может быть задан через elementFormDefault в xs:schema. |
id |
Игнорируется. |
maxOccurs |
1 |
minOccurs |
Сопоставляется свойству IsRequired элемента данных (IsRequired имеет значение true, когда minOccurs имеет значение 1). |
nillable |
Влияет на сопоставление типов. См. «Сопоставление тип-примитив». |
<xs:element> при maxOccurs>1 в <xs:sequence> (Коллекции)
Сопоставляется CollectionDataContractAttribute.
В типах коллекции только один xs:element допустим в xs:sequence.
Коллекции могут быть следующих типов:
Обычные коллекции (например, массивы).
Коллекции-словари (сопоставляющие одно значение другому; например, Hashtable).
- Единственное отличие между словарем и массивом типа пара ключ/значение заключается в создаваемой модели программирования. Существует механизм заметки схемы, который можно использовать чтобы указать, что данный тип является коллекцией-словарем.
Правила для атрибутов ref, block, default, fixed, form и id те же, что и в случае типов, не являющихся коллекциями. Другие атрибуты приведены в следующей таблице.
Атрибут | Схема |
---|---|
name |
Поддерживается, сопоставляется свойству ItemName в атрибуте CollectionDataContractAttribute. |
type |
Поддерживается, сопоставляется типу, хранящемуся в коллекции. |
maxOccurs |
Больше, чем 1 или unbounded. Для схемы контроллера домена следует использовать unbounded. |
minOccurs |
Игнорируется. |
nillable |
Влияет на сопоставление типов. Этот атрибут игнорируется в случае коллекций-словарей. |
<xs:element> в <xs:schema> Объявление глобального элемента
Объявление глобального элемента, имеющего то же имя и пространство имен, что и тип в схеме, или определяющего анонимный тип внутри себя, означает связь с типом.
Экспорт схемы: связанные объявления глобальных элементов создаются для каждого создаваемого типа, как простого, так и сложного.
Десериализация/сериализация: связанные объявления глобальных элементов используются в качестве корневых элементов данного типа.
Импорт схемы: связанные объявления глобальных элементов не требуются и игнорируются, если они соответствуют следующим правилам (если только они не определяют типы).
Атрибут | Схема |
---|---|
abstract |
Должен иметь значение false для связанных объявлений глобальных элементов. |
block |
Запрещено в связанных объявлениях глобальных элементов. |
default |
Запрещено в связанных объявлениях глобальных элементов. |
final |
Должен иметь значение false для связанных объявлений глобальных элементов. |
fixed |
Запрещено в связанных объявлениях глобальных элементов. |
id |
Игнорируется. |
name |
Поддерживается. См. определение связанных объявлений глобальных элементов. |
nillable |
Должен иметь значение true для связанных объявлений глобальных элементов. |
substitutionGroup |
Запрещено в связанных объявлениях глобальных элементов. |
type |
Поддерживается и должен соответствовать связанному типу связанных объявлений глобальных элементов (если только элемент не содержит анонимный тип). |
<xs:element>: содержимое
Содержание | Схема |
---|---|
simpleType |
Поддерживается.* |
complexType |
Поддерживается.* |
unique |
Игнорируется. |
key |
Игнорируется. |
keyref |
Игнорируется. |
(пусто) |
Поддерживается. |
* При использовании типов simpleType и complexType, сопоставление анонимных типов такое же, как и для типов, не являющихся анонимными, за исключением того, что анонимные контракты данных отсутствуют, и поэтому создается именованный контракт данных с именем, образованным от имени элемента. Ниже перечислены правила для анонимных типов.
Сведения о реализации WCF: если имя xs:element не содержит точек, анонимный тип сопоставляется внутреннему типу внешнего типа контракта данных. Если имя содержит точки, итоговый тип контракта данных является независимым (не внутренним типом).
Создаваемое имя контракта данных внутреннего типа — это имя контракта данных внешнего типа, за которым следует точка, имя элемента и строка Type.
Если контракт данных с таким именем уже существует, уникальное имя создается путем добавления «1», «2», «3» и т. д., пока не будет создано уникальное имя.
Простые типы — <xs:simpleType>
<xs:simpleType>: атрибуты
Атрибут | Схема |
---|---|
final |
Игнорируется. |
id |
Игнорируется. |
name |
Поддерживается, сопоставляется имени контракта данных. |
<xs:simpleType>: содержимое
Содержание | Схема |
---|---|
restriction |
Поддерживается. Сопоставляется контрактам данных перечислений. Если этот атрибут не соответствует шаблону перечисления, он игнорируется. См. раздел «Ограничения xs:simpleType». |
list |
Поддерживается. Сопоставляется контрактам данных перечислений флагов. См. раздел «Списки xs:simpleType». |
union |
Запрещено. |
<xs:restriction>
Ограничения сложных типов поддерживаются только для base="xs:anyType".
Ограничения простых типов xs:string, не имеющие никаких других аспектов ограничения, кроме xs:enumeration, сопоставляются контрактам данных перечисления.
Все другие ограничения простых типов сопоставляются типам, которые они ограничивают. Например, ограничение xs:int сопоставляется целому числу так же, как и xs:int. Дополнительные сведения о сопоставлении примитивных типов см. «Сопоставление тип-примитив».
<xs:restriction>: атрибуты
Атрибут | Схема |
---|---|
base |
Должен быть поддерживаемым простым типом или xs:anyType. |
id |
Игнорируется. |
<xs:restriction> для всех остальных случаев: содержимое
Содержание | Схема |
---|---|
simpleType |
Если существует, должен быть образован от поддерживаемого примитивного типа. |
minExclusive |
Игнорируется. |
minInclusive |
Игнорируется. |
maxExclusive |
Игнорируется. |
maxInclusive |
Игнорируется. |
totalDigits |
Игнорируется. |
fractionDigits |
Игнорируется. |
length |
Игнорируется. |
minLength |
Игнорируется. |
maxLength |
Игнорируется. |
enumeration |
Игнорируется. |
whiteSpace |
Игнорируется. |
pattern |
Игнорируется. |
(пусто) |
Поддерживается. |
Перечисление
<xs:restriction> для перечислений: атрибуты
Атрибут | Схема |
---|---|
base |
Если существует, должен быть xs:string. |
id |
Игнорируется. |
<xs:restriction> для перечислений: содержимое
Содержание | Схема |
---|---|
simpleType |
Если существует, должен быть ограничением перечисления, поддерживаемым контрактом данных (этот раздел). |
minExclusive |
Игнорируется. |
minInclusive |
Игнорируется. |
maxExclusive |
Игнорируется. |
maxInclusive |
Игнорируется. |
totalDigits |
Игнорируется. |
fractionDigits |
Игнорируется. |
length |
Запрещен. |
minLength |
Запрещен. |
maxLength |
Запрещен. |
enumeration |
Поддерживается. Перечисление «id» не учитывается и «value» сопоставляется имени значения в контракте данных перечисления. |
whiteSpace |
Запрещено. |
pattern |
Запрещено. |
(пусто) |
Поддерживается, сопоставляется пустому типу перечисления. |
В следующем коде показан класс перечисления C#.
public enum MyEnum
{
first = 3,
second = 4,
third =5
}
DataContractSerializer сопоставляет этот класс следующей схеме. Если значения перечисления начинаются с 1, блоки xs:annotation не создаются.
<xs:simpleType name="MyEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="first">
<xs:annotation>
<xs:appinfo>
<EnumerationValue
xmlns="https://schemas.microsoft.com/2003/10/Serialization/">
3
</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="second">
<xs:annotation>
<xs:appinfo>
<EnumerationValue
xmlns="https://schemas.microsoft.com/2003/10/Serialization/">
4
</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:list>
DataContractSerializer сопоставляет типы перечисления, отмеченные System.FlagsAttribute, xs:list, образованному из xs:string. Никакие другие виды xs:list не поддерживаются.
<xs:list>: атрибуты
Атрибут | Схема |
---|---|
itemType |
Запрещено. |
id |
Игнорируется. |
<xs:list>: содержимое
Содержание | Схема |
---|---|
simpleType |
Должен быть ограничением из xs:string, использующей аспект xs:enumeration. |
Если значение перечисления не является членом последовательности степеней 2 (по умолчанию для флагов), значение помещается в элемент xs:annotation/xs:appInfo/ser:EnumerationValue.
В следующем коде показана установка флагов для типа перечисления.
[Flags]
public enum AuthFlags
{
AuthAnonymous = 1,
AuthBasic = 2,
AuthNTLM = 4,
AuthMD5 = 16,
AuthPassport = 64,
}
Этот тип сопоставляется следующей схеме.
<xs:simpleType name="AuthFlags">
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="AuthAnonymous" />
<xs:enumeration value="AuthBasic" />
<xs:enumeration value="AuthNTLM" />
<xs:enumeration value="AuthMD5">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="https://schemas.microsoft.com/2003/10/Se
rialization/">16</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="AuthPassport">
<xs:annotation>
<xs:appinfo>
<EnumerationValue xmlns="https://schemas.microsoft.com/2003/10/Se
rialization/">64</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
Наследование
Основные правила
Контракт данных может наследовать от другого контракта данных. Такие контракты данных сопоставляются базовым и образуются типами расширения с помощью конструктора схемы XML <xs:extension>.
Контракт данных не может наследовать от контракта данных коллекции.
В следующем коде показан пример контракта данных.
[DataContract]
public class Person
{
[DataMember]
public string Name;
}
[DataContract]
public class Employee : Person
{
[DataMember]
public int ID;
}
Этот контракт данных сопоставляется следующему объявлению типа схемы XML.
<xs:complexType name="Employee">
<xs:complexContent mixed="false">
<xs:extension base="tns:Person">
<xs:sequence>
<xs:element minOccurs="0" name="ID" type="xs:int"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Person">
<xs:sequence>
<xs:element minOccurs="0" name="Name"
nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexContent>: атрибуты
Атрибут | Схема |
---|---|
id |
Игнорируется. |
mixed |
Должен иметь значение false. |
<xs:complexContent>: содержимое
Содержание | Схема |
---|---|
restriction |
Запрещено, за исключением случая, когда base="xs:anyType". Последнее эквивалентно помещению содержимого xs:restriction прямо под контейнер xs:complexContent. |
extension |
Поддерживается. Сопоставляется наследованию контракта данных. |
<xs:extension> в <xs:complexContent>: атрибуты
Атрибут | Схема |
---|---|
id |
Игнорируется. |
base |
Поддерживается. Сопоставляется базовому типу контракта данных, от которого наследует этот тип. |
<xs:extension> в <xs:complexContent>: содержимое
Применяются те же правила, что и для содержимого <xs:complexType>.
Если дается <xs:sequence>, ее элементы сопоставляются дополнительным элементам данных, присутствующим в производном контракте данных.
Если производный тип содержит элемент с тем же именем, что и элемент базового типа, дублирующееся объявление элемента сопоставляется члену данных с создаваемым уникальным именем. Положительные целые числа добавляются к имени члена данных («member1», «member2» и т. д.) до тех пор, пока не будет найдено уникальное имя. И наоборот:
Если производный контракт данных имеет член данных с тем же именем и типом, что и член данных в базовом контракте данных, DataContractSerializer создает соответствующий элемент в производном типе.
Если производный контракт данных имеет член данных с тем же именем, что и член данных в базовом контракте данных, но другой тип, DataContractSerializer импортирует схему с элементом типа xs:anyType как в базовый тип, так и в объявления производного типа. Исходное имя типа сохраняется в xs:annotations/xs:appInfo/ser:ActualType/@Name.
В обоих случаях может возникнуть схема с неоднозначной моделью содержимого, которая зависит от порядка соответствующих членов данных.
Сопоставление тип-примитив
DataContractSerializer использует следующие сопоставления для примитивных типов схемы XML.
Тип XSD | Тип .NET |
---|---|
anyType |
|
anySimpleType |
|
duration |
|
dateTime |
|
dateTimeOffset |
DateTime и TimeSpan для смещения. См. «Сериализация DateTimeOffset» ниже. |
time |
String. |
date |
String. |
gYearMonth |
String. |
gYear |
String. |
gMonthDay |
String. |
gDay |
String. |
gMonth |
String. |
boolean |
|
base64Binary |
Массив Byte. |
hexBinary |
String. |
float |
|
double |
|
anyURI |
Uri. |
QName |
|
string |
String. |
normalizedString |
String. |
token |
String. |
language |
String. |
Name |
String. |
NCName |
String. |
ID |
String. |
IDREF |
String. |
IDREFS |
String. |
ENTITY |
String. |
ENTITIES |
String. |
NMTOKEN |
String. |
NMTOKENS |
String. |
decimal |
|
integer |
|
nonPositiveInteger |
Int64. |
negativeInteger |
Int64. |
long |
Int64. |
int |
|
short |
|
Byte |
|
nonNegativeInteger |
Int64. |
unsignedLong |
|
unsignedInt |
|
unsignedShort |
|
unsignedByte |
Byte. |
positiveInteger |
Int64. |
ISerializable — сопоставление типов
В .NET Framework версии 1.0 интерфейс ISerializable использовался как основной механизм сериализации объектов для сохранения или передачи данных. Существует много типов .NET Framework, которые реализуют интерфейс ISerializable и могут автоматически передаваться между приложениями. DataContractSerializer обычно поддерживает классы ISerializable. DataContractSerializer сопоставляет типы схемы реализации ISerializable, отличающиеся только полным именем типа (QName) и фактически являющиеся коллекциями свойств. Например, DataContractSerializer сопоставляет Exception следующему типу XSD в пространстве имен http://schemas.datacontract.org/2004/07/System.
<xs:complexType name="Exception">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded"
namespace="##local" processContents="skip"/>
</xs:sequence>
<xs:attribute ref="ser:FactoryType"/>
</xs:complexType>
Необязательный атрибут ser:FactoryType, объявленный в схеме сериализации контракта данных ссылается на класс фабрики, который может выполнить десериализацию типа. Класс фабрики может входить в коллекцию известных типов используемого экземпляра DataContractSerializer. Дополнительные сведения об известных типах см. в разделе Известные типы контрактов данных.
DataContract — схема сериализации
Ряд схем, импортируемых DataContractSerializer, использует типы, элементы и атрибуты специального пространства имен сериализации контракта данных.
https://schemas.microsoft.com/2003/10/Serialization
Ниже приведен пример полного объявления схемы сериализации контракта данных.
<xs:schema attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace =
"https://schemas.microsoft.com/2003/10/Serialization/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="https://schemas.microsoft.com/2003/10/Serialization/">
<!-- Top-level elements for primitive types. -->
<xs:element name="anyType" nillable="true" type="xs:anyType"/>
<xs:element name="anyURI" nillable="true" type="xs:anyURI"/>
<xs:element name="base64Binary"
nillable="true" type="xs:base64Binary"/>
<xs:element name="boolean" nillable="true" type="xs:boolean"/>
<xs:element name="byte" nillable="true" type="xs:byte"/>
<xs:element name="dateTime" nillable="true" type="xs:dateTime"/>
<xs:element name="decimal" nillable="true" type="xs:decimal"/>
<xs:element name="double" nillable="true" type="xs:double"/>
<xs:element name="float" nillable="true" type="xs:float"/>
<xs:element name="int" nillable="true" type="xs:int"/>
<xs:element name="long" nillable="true" type="xs:long"/>
<xs:element name="QName" nillable="true" type="xs:QName"/>
<xs:element name="short" nillable="true" type="xs:short"/>
<xs:element name="string" nillable="true" type="xs:string"/>
<xs:element name="unsignedByte"
nillable="true" type="xs:unsignedByte"/>
<xs:element name="unsignedInt"
nillable="true" type="xs:unsignedInt"/>
<xs:element name="unsignedLong"
nillable="true" type="xs:unsignedLong"/>
<xs:element name="unsignedShort"
nillable="true" type="xs:unsignedShort"/>
<!-- Primitive types introduced for certain .NET simple types. -->
<xs:element name="char" nillable="true" type="tns:char"/>
<xs:simpleType name="char">
<xs:restriction base="xs:int"/>
</xs:simpleType>
<!-- xs:duration is restricted to an ordered value space,
to map to System.TimeSpan -->
<xs:element name="duration" nillable="true" type="tns:duration"/>
<xs:simpleType name="duration">
<xs:restriction base="xs:duration">
<xs:pattern
value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?"/>
<xs:minInclusive value="-P10675199DT2H48M5.4775808S"/>
<xs:maxInclusive value="P10675199DT2H48M5.4775807S"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="guid" nillable="true" type="tns:guid"/>
<xs:simpleType name="guid">
<xs:restriction base="xs:string">
<xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}"/>
</xs:restriction>
</xs:simpleType>
<!-- This is used for schemas exported from ISerializable type. -->
<xs:attribute name="FactoryType" type="xs:QName"/>
</xs:schema>
Необходимо отметить следующее.
ser:char введен для представления символов Юникода типа Char.
valuespace xs:duration сокращается до упорядоченного набора, чтобы можно было выполнить его сопоставление TimeSpan.
FactoryType используется в схемах, экспортируемых из типов, унаследованных от ISerializable.
Импорт схем, отличных от DataContract
В DataContractSerializer имеется функция ImportXmlTypes, которая выполняет импорт схем, не соответствующих профилю XSD DataContractSerializer (см. свойство Options). Если задать этому параметру значение true, типы схемы, не удовлетворяющие требованиям, будут приняты и сопоставлены следующей реализации; IXmlSerializable упакует массив XmlNode (отличается только имя класса).
[GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Xml.Serialization.XmlSchemaProviderAttribute("ExportSchema")]
[System.Xml.Serialization.XmlRootAttribute(IsNullable=false)]
public partial class Person : object, IXmlSerializable
{
private XmlNode[] nodesField;
private static XmlQualifiedName typeName =
new XmlQualifiedName("Person","http://Microsoft.ServiceModel.Samples");
public XmlNode[] Nodes
{
get {return this.nodesField;}
set {this.nodesField = value;}
}
public void ReadXml(XmlReader reader)
{
this.nodesField = XmlSerializableServices.ReadNodes(reader);
}
public void WriteXml(XmlWriter writer)
{
XmlSerializableServices.WriteNodes(writer, this.Nodes);
}
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public static XmlQualifiedName ExportSchema(XmlSchemaSet schemas)
{
XmlSerializableServices.AddDefaultSchema(schemas, typeName);
return typeName;
}
}
DateTimeOffset — сериализация
DateTimeOffset не обрабатывается как примитивный тип. Вместо этого он сериализуется как сложный элемент с двумя частями. Первая часть представляет дату и время, а вторая — смещение даты и времени. В следующем примере кода показано значение DateTimeOffset.
<OffSet xmlns:a="http://schemas.datacontract.org/2004/07/System">
<DateTime i:type="b:dateTime"
xmlns:b="http://www.w3.org/2001/XMLSchema">2008-08-28T08:00:00
</DateTime>
<OffsetMinutes i:type="b:short"
xmlns:b="http://www.w3.org/2001/XMLSchema">-480
</OffsetMinutes>
</OffSet>
Схема выглядит следующим образом.
<xs:schema targetNamespace="http://schemas.datacontract.org/2004/07/System">
<xs:complexType name="DateTimeOffset">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="DateTime" type="xs:dateTime"
minOccurs="1" maxOccurs="1" />
<xs:elementname="OffsetMinutes" type="xs:short"
minOccurs="1" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
</xs:schema>
См. также
Справочник
DataContractSerializer
DataContractAttribute
DataMemberAttribute
XsdDataContractImporter