Справочник по схеме контрактов данных

В данном разделе описывается подмножество схемы XML (XSD), используемое DataContractSerializer для описания типов среды CLR, применяемых для сериализации XML.

DataContractSerializer - сопоставления

DataContractSerializer Типы clR сопоставляются с XSD при экспорте метаданных из службы Windows Communication Foundation (WCF) с помощью конечной точки метаданных или служебной программы метаданных ServiceModel (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>: атрибуты

attribute DataContract
attributeFormDefault Не обрабатывается.
blockDefault Не обрабатывается.
elementFormDefault Должен иметь полное имя. Для того чтобы схема поддерживалась DataContractSerializer, все элементы должны иметь полное имя. Это можно сделать путем задания значения qualified для xs:schema/@elementFormDefault или для xs:element/@form при каждом объявлении элемента.
finalDefault Не обрабатывается.
Id Не обрабатывается.
targetNamespace Поддерживается и сопоставляется пространству имен контракта данных. Если данный атрибут не определен, используется пустое пространство имен. Не может быть зарезервированным пространством имен http://schemas.microsoft.com/2003/10/Serialization/.
version Не обрабатывается.

<xs:schema>: contents

Содержимое схема
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>: атрибуты

attribute схема
abstract По умолчанию должен иметь значение false.
block Запрещено.
final Не обрабатывается.
id Не обрабатывается.
mixed По умолчанию должен иметь значение false.
name Поддерживается и сопоставляется имени контракта данных. Если в имени имеются точки, выполняется попытка сопоставить тип внутреннему типу. Например, сложный тип с именем A.B сопоставляется контракту данных, который является внутренним типом для типа с именем контракта данных A, но только в том случае, если данный контракт данных существует. Может существовать более одного уровня вложения: например, A.B.C может быть внутренним типом, но только при условии, что и A , и A.B существуют.

<xs:complexType>: contents

Содержимое схема
simpleContent Расширения запрещены.

Ограничение разрешено только из anySimpleType.
complexContent Поддерживается. См. «Наследование».
group Запрещено.
all Запрещено.
choice Запрещено
sequence Поддерживается, сопоставляется членам данных контракта данных.
attribute Запрещено, даже если use="prohibited" (существует одно исключение). Только необязательные атрибуты из стандартного пространства имен сериализации поддерживаются. Они не сопоставляются членам данных в модели программирования контракта данных. В настоящее время только один подобный атрибут имеет значение; он рассматривается в разделе ISerializable. Другие атрибуты игнорируются.
attributeGroup Запрещено. В выпуске DataContractSerializer WCF версии 1 игнорирует наличие attributeGroup внутри xs:complexType.
anyAttribute Запрещено.
(пусто) Сопоставляется с контрактом данных, не имеющем элементов данных.

<xs:sequence> в сложном типе: атрибуты

attribute схема
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> (элементы данных)

attribute схема
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 те же, что и в случае типов, не являющихся коллекциями. Другие атрибуты приведены в следующей таблице.

attribute схема
name Поддерживается, сопоставляется свойству ItemName в атрибуте CollectionDataContractAttribute .
type Поддерживается, сопоставляется типу, хранящемуся в коллекции.
maxOccurs Больше, чем 1 или unbounded. Для схемы контроллера домена следует использовать unbounded.
minOccurs Не обрабатывается.
nillable Влияет на сопоставление типов. Этот атрибут игнорируется в случае коллекций-словарей.

<xs:element> в объявлении глобального <элемента xs:schema>

  • Объявление глобального элемента, имеющего то же имя и пространство имен, что и тип в схеме, или определяющего анонимный тип внутри себя, означает связь с типом.

  • Экспорт схемы: связанные объявления глобальных элементов создаются для каждого создаваемого типа, как простого, так и сложного.

  • Десериализация/сериализация: связанные объявления глобальных элементов используются в качестве корневых элементов данного типа.

  • Импорт схемы: связанные объявления глобальных элементов не требуются и игнорируются, если они соответствуют следующим правилам (если только они не определяют типы).

attribute схема
abstract Должен иметь значение false для связанных объявлений глобальных элементов.
block Запрещено в связанных объявлениях глобальных элементов.
default Запрещено в связанных объявлениях глобальных элементов.
final Должен иметь значение false для связанных объявлений глобальных элементов.
fixed Запрещено в связанных объявлениях глобальных элементов.
id Не обрабатывается.
name Поддерживается. См. определение связанных объявлений глобальных элементов.
nillable Должен иметь значение true для связанных объявлений глобальных элементов.
substitutionGroup Запрещено в связанных объявлениях глобальных элементов.
type Поддерживается и должен соответствовать связанному типу связанных объявлений глобальных элементов (если только элемент не содержит анонимный тип).

<xs:element>: contents

Содержимое схема
simpleType Поддерживается.*
complexType Поддерживается.*
unique Не обрабатывается.
key Не обрабатывается.
keyref Не обрабатывается.
(пусто) Поддерживается.

* При использовании simpleType и complexType, сопоставление для анонимных типов аналогично для неанонимных типов, за исключением отсутствия анонимных контрактов данных, поэтому создается именованный контракт данных с созданным именем, производным от имени элемента. Ниже перечислены правила для анонимных типов.

  • Сведения о реализации WCF. Если xs:element имя не содержит точки, анонимный тип сопоставляется с внутренним типом внешнего типа контракта данных. Если имя содержит точки, итоговый тип контракта данных является независимым (не внутренним типом).

  • Создаваемое имя контракта данных внутреннего типа - это имя контракта данных внешнего типа, за которым следует точка, имя элемента и строка Type.

  • Если контракт данных с таким именем уже существует, уникальное имя создается путем добавления "1", "2", "3" и т. д., пока не будет создано уникальное имя.

Простые типы — <xs:simpleType>

<xs:simpleType>: атрибуты

attribute схема
final Не обрабатывается.
id Не обрабатывается.
name Поддерживается, сопоставляется имени контракта данных.

<xs:simpleType>: contents

Содержимое схема
restriction Поддерживается. Сопоставляется контрактам данных перечислений. Если этот атрибут не соответствует шаблону перечисления, он игнорируется. См. раздел «Ограничения xs:simpleType ».
list Поддерживается. Сопоставляется контрактам данных перечислений флагов. См. раздел "Списки xs:simpleType ".
union Запрещено.

<xs:restriction>

  • Ограничения сложных типов поддерживаются только для base="xs:anyType".

  • Ограничения простых типов xs:string , не имеющие никаких других аспектов ограничения, кроме xs:enumeration , сопоставляются контрактам данных перечисления.

  • Все другие ограничения простых типов сопоставляются типам, которые они ограничивают. Например, ограничение xs:int сопоставляется с целым числом так же, как и xs:int . Дополнительные сведения о сопоставлении примитивных типов см. в разделе Сопоставление типов и примитивов.

<xs:restriction>: атрибуты

attribute схема
base Должен быть поддерживаемым простым типом или xs:anyType.
id Не обрабатывается.

<xs:restriction> для всех остальных случаев: содержимое

Содержимое схема
simpleType Если существует, должен быть образован от поддерживаемого примитивного типа.
minExclusive Не обрабатывается.
minInclusive Не обрабатывается.
maxExclusive Не обрабатывается.
maxInclusive Не обрабатывается.
totalDigits Не обрабатывается.
fractionDigits Не обрабатывается.
length Не обрабатывается.
minLength Не обрабатывается.
maxLength Не обрабатывается.
enumeration Не обрабатывается.
whiteSpace Не обрабатывается.
pattern Не обрабатывается.
(пусто) Поддерживается.

Перечисление

<xs:restriction> для перечислений: атрибуты

attribute схема
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="http://schemas.microsoft.com/2003/10/Serialization/">
          3
          </EnumerationValue>
        </xs:appinfo>
      </xs:annotation>
    </xs:enumeration>
    <xs:enumeration value="second">
      <xs:annotation>
        <xs:appinfo>
          <EnumerationValue xmlns="http://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>:

attribute схема
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,
  AuthWindowsLiveID = 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="http://schemas.microsoft.com/2003/10/Serialization/">16</EnumerationValue>
              </xs:appinfo>
            </xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="AuthWindowsLiveID">
            <xs:annotation>
              <xs:appinfo>
                <EnumerationValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/">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>: атрибуты

attribute схема
id Не обрабатывается.
mixed Должен иметь значение false.

<xs:complexContent>: содержимое

Содержимое схема
restriction Запрещено, за исключением случая, когда base="xs:anyType". Последнее эквивалентно помещению содержимого xs:restriction прямо под контейнер xs:complexContent.
extension Поддерживается. Сопоставляется наследованию контракта данных.

<xs:extension> in <xs:complexContent>: attributes

attribute схема
id Не обрабатывается.
base Поддерживается. Сопоставляется базовому типу контракта данных, от которого наследует этот тип.

<xs:extension> in <xs:complexContent>: contents

Применяются те же правила, что и для содержимого <xs:complexType> .

Если дается <xs:sequence> , ее элементы сопоставляются дополнительным членам данных, присутствующим в производном контракте данных.

Если производный тип содержит элемент с тем же именем, что и элемент базового типа, дублирующееся объявление элемента сопоставляется члену данных с создаваемым уникальным именем. Положительные целые числа добавляются к имени члена данных («member1», «member2» и т. д.) до тех пор, пока не будет найдено уникальное имя. И наоборот:

  • Если производный контракт данных имеет член данных с тем же именем и типом, что и член данных в базовом контракте данных, DataContractSerializer создает соответствующий элемент в производном типе.

  • Если производный контракт данных имеет член данных с тем же именем, что и член данных в базовом контракте данных, но другой тип, DataContractSerializer импортирует схему с элементом типа xs:anyType как в базовый тип, так и в объявления производного типа. Исходное имя типа сохраняется в xs:annotations/xs:appInfo/ser:ActualType/@Name.

В обоих случаях может возникнуть схема с неоднозначной моделью содержимого, которая зависит от порядка соответствующих членов данных.

Сопоставление тип-примитив

DataContractSerializer использует следующие сопоставления для примитивных типов схемы XML.

Тип XSD Тип .NET
anyType Object.
anySimpleType String.
duration TimeSpan.
dateTime DateTime.
dateTimeOffset DateTime и TimeSpan для смещения. См. «Сериализация DateTimeOffset» ниже.
time String.
date String.
gYearMonth String.
gYear String.
gMonthDay String.
gDay String.
gMonth String.
boolean Boolean
base64Binary Массив Byte.
hexBinary String.
float Single.
double Double.
anyURI Uri.
QName XmlQualifiedName.
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 Decimal.
integer Int64.
nonPositiveInteger Int64.
negativeInteger Int64.
long Int64.
int Int32.
short Int16.
Byte SByte.
nonNegativeInteger Int64.
unsignedLong UInt64.
unsignedInt UInt32.
unsignedShort UInt16.
unsignedByte Byte.
positiveInteger Int64.

Сопоставление типов ISerializable

В платформа .NET Framework версии 1.0 ISerializable был представлен в качестве общего механизма сериализации объектов для сохраняемости или передачи данных. Существует множество платформа .NET Framework типов, реализующих ISerializable и которые могут передаваться между приложениями. DataContractSerializer поддерживает классы ISerializable . DataContractSerializer сопоставляет типы схемы реализации ISerializable , отличающиеся только полным именем типа (QName) и фактически являющиеся коллекциями свойств. Например, сопоставляется DataContractSerializerException со следующим типом 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 , использует типы, элементы и атрибуты специального пространства имен сериализации контракта данных.

http://schemas.microsoft.com/2003/10/Serialization

Ниже приведен пример полного объявления схемы сериализации контракта данных.

<xs:schema attributeFormDefault="qualified"
   elementFormDefault="qualified"
   targetNamespace =
    "http://schemas.microsoft.com/2003/10/Serialization/"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:tns="http://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.

  • valuespacexs: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=""
    xmlns:b="http://www.w3.org/2001/XMLSchema">2008-08-28T08:00:00
  </DateTime>
  <OffsetMinutes i:type="b:short" xmlns=""
   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:element name="OffsetMinutes" type="xs:short"
         minOccurs="1" maxOccurs="1" />
      </xs:sequence>
   </xs:complexType>
</xs:schema>

См. также