Поделиться через


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

В данном разделе описывается подмножество схемы 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

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) и фактически являющиеся коллекциями свойств. Например, 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

Основные понятия

Использование контрактов данных