Schéma kontraktů dat – referenční informace

Toto téma popisuje podmnožinu schématu XML (XSD), kterou používá DataContractSerializer k popisu typů modulu CLR (Common Language Runtime) pro serializaci XML.

Mapování dataContractSerializer

Při DataContractSerializer exportu metadat ze služby Windows Communication Foundation (WCF) pomocí koncového bodu metadat nebo nástroje ServiceModel Metadata Utility Tool (Svcutil.exe) mapuje typy CLR na XSD. Další informace najdete v tématu Serializátor kontraktu dat.

Nástroj DataContractSerializer také mapuje XSD na typy CLR, pokud se Svcutil.exe používá pro přístup k dokumentům WSDL (Web Services Description Language) nebo XSD a generování kontraktů dat pro služby nebo klienty.

Pouze instance schémat XML, které splňují požadavky uvedené v tomto dokumentu, lze mapovat na typy CLR pomocí DataContractSerializer.

Úrovně podpory

Poskytuje DataContractSerializer následující úrovně podpory pro danou funkci schématu XML:

  • Podporováno. K dispozici je explicitní mapování z této funkce na typy nebo atributy CLR (nebo obojí) pomocí DataContractSerializer.

  • Ignorováno. Funkce je povolena ve schématech importovaných nástrojem DataContractSerializer, ale nemá žádný vliv na generování kódu.

  • Zakázáno. Nástroj DataContractSerializer nepodporuje import schématu pomocí funkce. Například Svcutil.exe při přístupu k WSDL se schématem, které používá takovou funkci, vrátí místo toho k použití XmlSerializer . To je ve výchozím nastavení.

Obecné informace

  • Obor názvů schématu je popsaný v tématu Schéma XML. V tomto dokumentu se používá předpona xs.

  • Všechny atributy s oborem názvů bez schématu jsou ignorovány.

  • Všechny poznámky (s výjimkou poznámek popsaných v tomto dokumentu) se ignorují.

<xs:schema>: atributy

Atribut DataContract
attributeFormDefault Ignorovány.
blockDefault Ignorovány.
elementFormDefault Musí být kvalifikován. Všechny prvky musí být kvalifikovány pro schéma, které má být podporováno nástrojem DataContractSerializer. Toho lze dosáhnout nastavením xs:schema/@elementFormDefault na "qualified" nebo nastavením xs:element/@form na "kvalifikované" u každé deklarace jednotlivých prvků.
finalDefault Ignorovány.
Id Ignorovány.
targetNamespace Podporováno a mapováno na obor názvů kontraktu dat. Pokud tento atribut není zadaný, použije se prázdný obor názvů. Nemůže být vyhrazeným oborem názvů http://schemas.microsoft.com/2003/10/Serialization/.
version Ignorovány.

<xs:schema>: contents

Obsah Schéma
include Podporuje se. DataContractSerializer podporuje xs:include a xs:import. Svcutil.exe však omezuje sledování xs:include/@schemaLocation a xs:import/@location odkazy při načítání metadat z místního souboru. Seznam souborů schématu musí být předán prostřednictvím vzdáleného mechanismu, a v tomto případě ne skrz include ; include Dokumenty schématu d jsou ignorovány.
redefine Zakázáno. Použití je zakázáno z bezpečnostních xs:redefine důvodů: x:redefine vyžadujeschemaLocation, aby bylo dodrženo.DataContractSerializer Za určitých okolností Svcutil.exe použití DataContract omezuje použití .schemaLocation
import Podporuje se. DataContractSerializer podporuje xs:include a xs:import. Svcutil.exe však omezuje sledování xs:include/@schemaLocation a xs:import/@location odkazy při načítání metadat z místního souboru. Seznam souborů schématu musí být předán prostřednictvím vzdáleného mechanismu, a v tomto případě ne skrz include ; include Dokumenty schématu d jsou ignorovány.
simpleType Podporuje se. Přečtěte si část xs:simpleType.
complexType Podporuje se mapování na kontrakty dat. Přečtěte si část xs:complexType.
group Ignorovány. DataContractSerializernepodporuje použití , xs:groupxs:attributeGroupa xs:attribute. Tyto deklarace se ignorují jako podřízené objekty , xs:schemaale nelze na ni odkazovat v rámci complexType ani jiné podporované konstruktory.
attributeGroup Ignorovány. DataContractSerializernepodporuje použití , xs:groupxs:attributeGroupa xs:attribute. Tyto deklarace se ignorují jako podřízené objekty , xs:schemaale nelze na ni odkazovat v rámci complexType ani jiné podporované konstruktory.
element Podporuje se. Viz GED (Global Element Declaration).
attribute Ignorovány. DataContractSerializernepodporuje použití , xs:groupxs:attributeGroupa xs:attribute. Tyto deklarace se ignorují jako podřízené objekty , xs:schemaale nelze na ni odkazovat v rámci complexType ani jiné podporované konstruktory.
notation Ignorovány.

Komplexní typy – <xs:complexType>

Obecné informace

Každý komplexní typ <xs:complexType> se mapuje na kontrakt dat.

<xs:complexType>: atributy

Atribut Schéma
abstract Musí být false (výchozí).
block Zakázáno.
final Ignorovány.
id Ignorovány.
mixed Musí být false (výchozí).
name Podporuje se a mapuje se na název kontraktu dat. Pokud název obsahuje tečky, je proveden pokus o mapování typu na vnitřní typ. Například komplexní typ s názvem A.B se mapuje na typ datového kontraktu, který je vnitřním typem typu s názvem Akontraktu dat , ale pouze v případě, že takový typ kontraktu dat existuje. Je možné vnořovat více než jednu úroveň: může být například A.B.C vnitřním typem, ale pouze v případě, že AA.B existuje obojí.

<xs:complexType>: contents

Obsah Schéma
simpleContent Rozšíření jsou zakázána.

Omezení je povoleno pouze z .anySimpleType
complexContent Podporuje se. Viz "Dědičnost".
group Zakázáno.
all Zakázáno.
choice Forbidden
sequence Podporuje se mapování na datové členy datového kontraktu.
attribute Zakázáno, i když use="zakázáno" (s jednou výjimkou). Podporují se pouze volitelné atributy z oboru názvů standardního schématu serializace. Nemapují se na datové členy v programovacím modelu kontraktu dat. V současné době má význam pouze jeden takový atribut a je popsán v části ISerializable. Všechny ostatní jsou ignorovány.
attributeGroup Zakázáno. Ve verzi DataContractSerializer WCF v1 ignoruje přítomnost uvnitř attributeGroupxs:complexType.
anyAttribute Zakázáno.
(prázdné) Mapuje se na kontrakt dat bez datových členů.

<xs:sequence> v komplexním typu: attributes

Atribut Schéma
id Ignorovány.
maxOccurs Musí být 1 (výchozí).
minOccurs Musí být 1 (výchozí).

<xs:sequence> v komplexním typu: contents

Obsah Schéma
element Každá instance se mapuje na datový člen.
group Zakázáno.
choice Zakázáno.
sequence Zakázáno.
any Zakázáno.
(prázdné) Mapuje se na kontrakt dat bez datových členů.

Elementy – <xs:element>

Obecné informace

<xs:element> může nastat v následujících kontextech:

  • Může k tomu dojít v rámci objektu <xs:sequence>, který popisuje datový člen běžného kontraktu dat (nesbírového). V tomto případě maxOccurs musí být atribut 1. (Hodnota 0 není povolena.)

  • Může k tomu dojít v rámci objektu <xs:sequence>, který popisuje datový člen kontraktu dat kolekce. V tomto případě maxOccurs musí být atribut větší než 1 nebo "bez vazby".

  • Může k ní dojít v rámci <xs:schema> GED (Global Element Declaration).

<xs:element> s maxOccurs=1 v rámci <xs:sekvence> (datové členy)

Atribut Schéma
ref Zakázáno.
name Podporuje se, mapuje se na název datového člena.
type Podporuje se, mapuje se na typ datového členu. Další informace najdete v tématu Mapování typu nebo primitivního mapování. Pokud není zadaný (a element neobsahuje anonymní typ), xs:anyType předpokládá se.
block Ignorovány.
default Zakázáno.
fixed Zakázáno.
form Musí být kvalifikované. Tento atribut lze nastavit prostřednictvím v elementFormDefault .xs:schema
id Ignorovány.
maxOccurs 1
minOccurs Mapuje na IsRequired vlastnost datového členu (IsRequired má hodnotu true, když minOccurs je 1).
nillable Ovlivňuje mapování typů. Viz Mapování typu nebo primitivního mapování.

<xs:element> s parametrem maxOccurs>1 v rámci <xs:sequence> (kolekce)

Kolekce můžou být následujících typů:

  • Běžné kolekce (například pole).

  • Slovníkové kolekce (mapování jedné hodnoty na jinou Hashtable, například ).

  • Jediný rozdíl mezi slovníkem a polem typu páru klíč/hodnota je ve vygenerovaném programovacím modelu. Existuje mechanismus anotace schématu, který lze použít k označení, že daný typ je kolekce slovníku.

Pravidla pro refatributy , , block, default, fixedforma id jsou stejná jako pro případ, který není kolekcí. Další atributy zahrnují atributy v následující tabulce.

Atribut Schéma
name Podporuje se mapování na ItemName vlastnost v atributu CollectionDataContractAttribute .
type Podporuje se, mapuje se na typ uložený v kolekci.
maxOccurs Větší než 1 nebo "bez vazby". Schéma řadiče domény by mělo používat "bez vazby".
minOccurs Ignorovány.
nillable Ovlivňuje mapování typů. Tento atribut je ignorován pro kolekce slovníku.

<xs:element> v rámci deklarace globálního <elementu xs:schema>

  • Globální deklarace elementu (GED), která má stejný název a obor názvů jako typ ve schématu nebo která definuje anonymní typ uvnitř sebe, se říká, že je přidružena k typu.

  • Export schématu: Přidružené identifikátory GED se generují pro každý vygenerovaný typ, jednoduchý i složitý.

  • Deserializace/serializace: Přidružené gedy se používají jako kořenové elementy pro typ.

  • Import schématu: Přidružené identifikátory GED se nevyžadují a jsou ignorovány, pokud dodržují následující pravidla (pokud nedefinují typy).

Atribut Schéma
abstract Pro přidružené identifikátory GED musí být false.
block Zakázáno v přidružených identifikátorech GED.
default Zakázáno v přidružených identifikátorech GED.
final Pro přidružené identifikátory GED musí být false.
fixed Zakázáno v přidružených identifikátorech GED.
id Ignorovány.
name Podporuje se. Projděte si definici přidružených GED.
nillable Musí mít hodnotu true pro přidružené identifikátory GED.
substitutionGroup Zakázáno v přidružených identifikátorech GED.
type Podporuje se a musí odpovídat přidruženému typu pro přidružené gedy (pokud element neobsahuje anonymní typ).

<xs:element>: contents

Obsah Schéma
simpleType Podporovány.*
complexType Podporovány.*
unique Ignorovány.
key Ignorovány.
keyref Ignorovány.
(prázdné) Podporuje se.

* Při použití simpleType a complexType, mapování pro anonymní typy je stejné jako u neanonymních typů, s tím rozdílem, že neexistují žádné anonymní kontrakty dat, a proto je vytvořen pojmenovaný kontrakt dat s vygenerovaným názvem odvozeným z názvu prvku. Pravidla pro anonymní typy jsou v následujícím seznamu:

  • Podrobnosti implementace WCF: Pokud xs:element název neobsahuje tečky, anonymní typ mapuje na vnitřní typ vnějšího datového kontraktu. Pokud název obsahuje tečky, je výsledný typ kontraktu dat nezávislý (nikoli vnitřní typ).

  • Vygenerovaný název kontraktu dat vnitřního typu je název kontraktu dat vnějšího typu následovaný tečkou, názvem elementu a řetězcem "Type".

  • Pokud už datová smlouva s tímto názvem existuje, název se vytvoří jedinečným připojením "1", "2", "3" atd., dokud se jedinečný název nevytvořil.

Jednoduché typy – <xs:simpleType>

<xs:simpleType>: attributes

Atribut Schéma
final Ignorovány.
id Ignorovány.
name Podporuje se, mapuje se na název kontraktu dat.

<xs:simpleType>: contents

Obsah Schéma
restriction Podporuje se. Mapuje se na výčet kontraktů dat. Tento atribut se ignoruje, pokud neodpovídá vzoru výčtu. Projděte si část věnovanou xs:simpleType omezením.
list Podporuje se. Mapuje označení kontraktů dat výčtu. Podívejte se na xs:simpleType část se seznamy.
union Zakázáno.

<xs:omezení>

  • Omezení komplexních typů jsou podporována pouze pro base="xs:anyType".

  • Jednoduchá omezení xs:string typů, která nemají žádné omezující vlastnosti kromě xs:enumeration mapování na výčtové datové kontrakty.

  • Všechna ostatní omezení jednoduchých typů jsou mapována na typy, které omezují. Například omezení xs:int mapování na celé číslo, stejně jako xs:int samo. Další informace o mapování primitivních typů najdete v tématu Mapování typu nebo primitivního mapování.

<xs:restriction>: attributes

Atribut Schéma
base Musí se jednat o podporovaný jednoduchý typ nebo xs:anyType.
id Ignorovány.

<xs:omezení> pro všechny ostatní případy: contents

Obsah Schéma
simpleType Pokud existuje, musí být odvozen z podporovaného primitivního typu.
minExclusive Ignorovány.
minInclusive Ignorovány.
maxExclusive Ignorovány.
maxInclusive Ignorovány.
totalDigits Ignorovány.
fractionDigits Ignorovány.
length Ignorovány.
minLength Ignorovány.
maxLength Ignorovány.
enumeration Ignorovány.
whiteSpace Ignorovány.
pattern Ignorovány.
(prázdné) Podporuje se.

Výčet

<xs:restriction> pro výčty: attributes

Atribut Schéma
base Pokud je k dispozici, musí být xs:string.
id Ignorovány.

<xs:omezení> pro výčty: contents

Obsah Schéma
simpleType Pokud je k dispozici, musí se jednat o omezení výčtu podporované kontraktem dat (tento oddíl).
minExclusive Ignorovány.
minInclusive Ignorovány.
maxExclusive Ignorovány.
maxInclusive Ignorovány.
totalDigits Ignorovány.
fractionDigits Ignorovány.
length Zakázáno.
minLength Zakázáno.
maxLength Zakázáno.
enumeration Podporuje se. Výčet "id" se ignoruje a "value" se mapuje na název hodnoty v datovém kontraktu výčtu.
whiteSpace Zakázáno.
pattern Zakázáno.
(prázdné) Podporuje se, mapuje se na prázdný typ výčtu.

Následující kód ukazuje třídu výčtu jazyka C#.

public enum MyEnum
{
  first = 3,
  second = 4,
  third =5
}

Tato třída se mapuje na následující schéma pomocí DataContractSerializer. Pokud hodnoty výčtu začínají od 1, xs:annotation bloky se nevygenerují.

<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 mapuje typy výčtu označené pomocí System.FlagsAttribute k odvození xs:list z xs:string. Žádné jiné xs:list varianty nejsou podporovány.

<xs:list>: attributes

Atribut Schéma
itemType Zakázáno.
id Ignorovány.

<xs:list>: contents

Obsah Schéma
simpleType Musí být omezení použití xs:stringxs:enumeration omezující vlastnosti.

Pokud hodnota výčtu nemá mocninu 2 průběh (výchozí hodnota pro Flags), hodnota je uložena v elementu xs:annotation/xs:appInfo/ser:EnumerationValue .

Například následující kód označí typ výčtu.

[Flags]
public enum AuthFlags
{
  AuthAnonymous = 1,
  AuthBasic = 2,
  AuthNTLM = 4,
  AuthMD5 = 16,
  AuthWindowsLiveID = 64,
}

Tento typ se mapuje na následující schéma.

<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>

Dědičnost

Obecná pravidla

Kontrakt dat může dědit z jiného kontraktu dat. Takové kontrakty dat se mapují na základ a jsou odvozeny typy rozšíření pomocí konstruktoru schématu <xs:extension> XML.

Datový kontrakt nemůže dědit z kontraktu dat kolekce.

Například následující kód je kontrakt dat.

[DataContract]
public class Person
{
  [DataMember]
  public string Name;
}
[DataContract]
public class Employee : Person
{
  [DataMember]
  public int ID;
}

Tento kontrakt dat se mapuje na následující deklaraci typu schématu 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>: attributes

Atribut Schéma
id Ignorovány.
mixed Musí být false.

<xs:complexContent>: contents

Obsah Schéma
restriction Zakázáno, s výjimkou případů, kdy base="xs:anyType" Druhý typ se rovná umístění obsahu objektu xs:restriction přímo pod nádobu xs:complexContent.
extension Podporuje se. Mapuje se na dědičnost kontraktů dat.

<xs:extension> v <xs:complexContent>: attributes

Atribut Schéma
id Ignorovány.
base Podporuje se. Mapuje se na typ základního kontraktu dat, ze kterého tento typ dědí.

<xs:extension> v <xs:complexContent>: contents

Pravidla jsou stejná jako pro <xs:complexType> obsah.

<xs:sequence> Pokud je zadaný, jeho členské prvky se mapují na další datové členy, které se nacházejí v odvozené datové smlouvě.

Pokud odvozený typ obsahuje prvek se stejným názvem jako prvek v základním typu, duplicitní deklarace elementu mapuje na datový člen s názvem, který je generován, aby byl jedinečný. Kladná celočíselná čísla se přidají k názvu datového členu ("member1", "member2" atd.), dokud se nenajde jedinečný název. Naopak:

  • Pokud má odvozený datový kontrakt datový člen se stejným názvem a typem jako datový člen v kontraktu základních dat, DataContractSerializer vygeneruje tento odpovídající prvek v odvozený typ.

  • Pokud má odvozený datový kontrakt datový člen se stejným názvem jako datový člen v kontraktu základních dat, ale jiným typem, DataContractSerializer importuje schéma s prvkem typu xs:anyType v deklaraci základního typu i odvozeného typu. Původní název typu se v zachovají.xs:annotations/xs:appInfo/ser:ActualType/@Name

Obě varianty mohou vést ke schématu s nejednoznačným modelem obsahu, který závisí na pořadí příslušných datových členů.

Mapování typu nebo primitivního mapování

Používá DataContractSerializer následující mapování pro primitivní typy schématu XML.

Typ XSD Typ .NET
anyType Object.
anySimpleType String.
duration TimeSpan.
dateTime DateTime.
dateTimeOffset DateTime a TimeSpan pro posun. Viz Serializace DateTimeOffset níže.
time String.
date String.
gYearMonth String.
gYear String.
gMonthDay String.
gDay String.
gMonth String.
boolean Boolean
base64Binary Byte Pole.
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.

Mapování typů ISerializable

V rozhraní .NET Framework verze 1.0 ISerializable byl zaveden jako obecný mechanismus serializace objektů pro trvalost nebo přenos dat. Existuje mnoho typů rozhraní .NET Framework, které implementují ISerializable a které lze předávat mezi aplikacemi. DataContractSerializer přirozeně poskytuje podporu pro ISerializable třídy. Mapuje DataContractSerializerISerializable typy schémat implementace, které se liší pouze QName (kvalifikovaný název) typu a jsou vlastně kolekcemi vlastností. Například se DataContractSerializer mapuje Exception na následující typ XSD v http://schemas.datacontract.org/2004/07/System oboru názvů.

<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>

Volitelný atribut ser:FactoryType deklarovaný ve schématu serializace kontraktu dat odkazuje na třídu továrny, která může deserializovat typ. Třída factory musí být součástí kolekce DataContractSerializer známých typů používané instance. Další informace o známých typech najdete v tématu Známé typy kontraktů dat.

Schéma serializace DataContract

Řada schémat exportovaných DataContractSerializer pomocí typů použití, elementů a atributů ze speciálního oboru názvů serializace kontraktu dat:

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

Následuje kompletní deklarace schématu serializace kontraktu dat.

<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>

Je třeba poznamenat následující:

  • ser:char představuje znaky Unicode typu Char.

  • Parametr valuespace of xs:duration je redukován na seřazenou sadu, aby ji bylo možné namapovat na TimeSpan.

  • FactoryType se používá ve schématech exportovaných z typů odvozených z ISerializable.

Import schémat jiných než DataContract

DataContractSerializerImportXmlTypes má možnost povolit import schémat, která neodpovídají DataContractSerializer profilu XSD (viz Options vlastnost ). Nastavením této možnosti na true povolíte přijetí nevyhovujících typů schémat a jejich mapování na následující implementaci, IXmlSerializable které zabalí pole XmlNode (liší se pouze název třídy).

[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;
  }
}

Serializace DateTimeOffset

Není DateTimeOffset považován za primitivní typ. Místo toho je serializován jako komplexní prvek se dvěma částmi. První část představuje datum a čas a druhá představuje posun od data a času. Příklad serializované Hodnoty DateTimeOffset je zobrazen v následujícím kódu.

<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>

Schéma je následující.

<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>

Viz také