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


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

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

Атрибут DataContract
attributeFormDefault Пропускается.
blockDefault Пропускается.
elementFormDefault Должен иметь полное имя. Для того чтобы схема поддерживалась DataContractSerializer, все элементы должны иметь полное имя. Это можно сделать, задав параметр xs:schema/@elementFormDefault значение "квалифицирован" или задав параметр xs:element/@form значение "квалифицировано" для каждого объявления отдельного элемента.
finalDefault Пропускается.
Id Пропускается.
targetNamespace Поддерживается и сопоставляется пространству имен контракта данных. Если данный атрибут не определен, используется пустое пространство имен. Не может быть зарезервированным пространством http://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 Запрещено. В выпуске DataContractSerializer WCF версии 1 игнорирует наличие 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> (Collections)

  • Сопоставляется 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="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>: атрибуты

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

Атрибут Схема
id Пропускается.
mixed Должен иметь значение false.

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

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

<xs:extension> in <xs:complexContent>: атрибуты

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

<xs:extension> in <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 , использует типы, элементы и атрибуты специального пространства имен сериализации контракта данных.

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>

См. также