Sdílet prostřednictvím


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

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

Mapování dataContractSerializer

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

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

Pouze instance schématu XML, které odpovídají požadavkům uvedeným 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. Z této funkce je explicitní mapování na typy nebo atributy CLR (nebo obojí) pomocí DataContractSerializer.

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

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

Obecné informace

  • Obor názvů schématu je popsán ve schématu XML. V tomto dokumentu se používá předpona xs.

  • Všechny atributy s oborem názvů bez schématu se ignorují.

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

<xs:schema>: atributy

Atribut DataContract
attributeFormDefault Ignorovaný.
blockDefault Ignorovaný.
elementFormDefault Musí být kvalifikovaný. Všechny prvky musí být kvalifikované, aby schéma bylo podporováno DataContractSerializer. Toho lze dosáhnout nastavením xs:schema/@elementFormDefault na "kvalifikovaný" nebo nastavením xs:element/@form na "kvalifikovaný" pro každou deklaraci jednotlivých prvků.
finalDefault Ignorovaný.
Id Ignorovaný.
targetNamespace Podporováno a namapováno na obor názvů kontraktu dat. Pokud tento atribut není zadán, použije se prázdný obor názvů. Nelze nastavit vyhrazený obor názvů http://schemas.microsoft.com/2003/10/Serialization/.
version Ignorovaný.

<xs:schema>: obsah

Obsah Schéma
include Podporovan. DataContractSerializer podporuje xs:include a xs:import. Svcutil.exe však omezuje následující xs:include/@schemaLocation odkazy a xs:import/@location odkazy při načtení metadat z místního souboru. Seznam souborů schématu musí být předán prostřednictvím vzdáleného mechanismu, a ne prostřednictvím include v tomto případě; includeDokumenty schématu d jsou ignorovány.
redefine Zakázaný. 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 Podporovan. DataContractSerializer podporuje xs:include a xs:import. Svcutil.exe však omezuje následující xs:include/@schemaLocation odkazy a xs:import/@location odkazy při načtení metadat z místního souboru. Seznam souborů schématu musí být předán prostřednictvím vzdáleného mechanismu, a ne prostřednictvím include v tomto případě; includeDokumenty schématu d jsou ignorovány.
simpleType Podporovan. xs:simpleType Viz část.
complexType Podporováno, mapuje se na kontrakty dat. xs:complexType Viz část.
group Ignorovaný. DataContractSerializernepodporuje použití , xs:groupxs:attributeGroupa xs:attribute. Tyto deklarace jsou ignorovány jako podřízené položky xs:schema, ale nelze na ni odkazovat z rámci complexType nebo jiných podporovaných konstruktorů.
attributeGroup Ignorovaný. DataContractSerializernepodporuje použití , xs:groupxs:attributeGroupa xs:attribute. Tyto deklarace jsou ignorovány jako podřízené položky xs:schema, ale nelze na ni odkazovat z rámci complexType nebo jiných podporovaných konstruktorů.
element Podporovan. Viz Globální deklarace elementu (GED).
attribute Ignorovaný. DataContractSerializernepodporuje použití , xs:groupxs:attributeGroupa xs:attribute. Tyto deklarace jsou ignorovány jako podřízené položky xs:schema, ale nelze na ni odkazovat z rámci complexType nebo jiných podporovaných konstruktorů.
notation Ignorovaný.

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ázaný.
final Ignorovaný.
id Ignorovaný.
mixed Musí být false (výchozí).
name Podporuje se a mapuje na název kontraktu dat. Pokud v názvu existují tečky, provede se pokus o mapování typu na vnitřní typ. Například komplexní typ pojmenovaný A.B se mapuje na datový typ kontraktu, který je vnitřním typem typu s názvem Adatového kontraktu , ale pouze v případě, že takový typ datového kontraktu existuje. Je možné použít více než jednu úroveň vnoření: může to být například A.B.C vnitřní typ, ale pouze pokud A a A.B oba existují.

<xs:complexType>: obsah

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

Omezení je povoleno pouze z anySimpleType.
complexContent Podporovan. Viz "Dědičnost".
group Zakázaný.
all Zakázaný.
choice Zakázáno
sequence Podporováno, mapuje se 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 ze standardního oboru názvů 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 oddílu ISerializable. Všechny ostatní jsou ignorovány.
attributeGroup Zakázaný. Ve verzi DataContractSerializer WCF v1 ignoruje přítomnost attributeGroup uvnitř xs:complexType.
anyAttribute Zakázaný.
(prázdné) Mapuje se na kontrakt dat bez datových členů.

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

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

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

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

Elements – <xs:element>

Obecné informace

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

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

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

  • Může k němu dojít v rámci globální deklarace elementu <xs:schema> (GED).

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

Atribut Schéma
ref Zakázaný.
name Podporováno, mapuje se na název datového člena.
type Podporováno, mapuje se na datový typ. Další informace naleznete v tématu Typ/primitivní mapování. Pokud není zadán (a prvek neobsahuje anonymní typ), xs:anyType předpokládá se.
block Ignorovaný.
default Zakázaný.
fixed Zakázaný.
form Musí být kvalifikovaný. Tento atribut lze nastavit pomocí elementFormDefault parametru xs:schema.
id Ignorovaný.
maxOccurs 0
minOccurs Mapuje se na IsRequired vlastnost datového členu (IsRequired je true, pokud minOccurs je 1).
nillable Ovlivňuje mapování typů. Viz mapování typu nebo primitiv.

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

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

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

  • Kolekce slovníků (mapování jedné hodnoty na jinou, například na Hashtable).

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

Pravidla pro refobjekty , , defaultformblockfixeda id atributy jsou stejné jako pro případ nesouvisejí s kolekcí. Mezi další atributy patří následující tabulka.

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

<xs:element> v rámci globální deklarace 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žen k typu.

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

  • Deserializace/serializace: přidružené GED se používají jako kořenové prvky pro daný typ.

  • Import schématu: Přidružené identifikátory GED nejsou povinné a jsou ignorovány, pokud se řídí následujícími pravidly (pokud nedefinují typy).

Atribut Schéma
abstract Musí být false pro přidružené identifikátory GED.
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 Musí být false pro přidružené identifikátory GED.
fixed Zakázáno v přidružených identifikátorech GED.
id Ignorovaný.
name Podporovan. Podívejte se na definici přidružených ged.
nillable Musí být true pro přidružené gedy.
substitutionGroup Zakázáno v přidružených identifikátorech GED.
type Podporováno a musí odpovídat přidruženému typu pro přidružené gedy (pokud prvek neobsahuje anonymní typ).

<xs:element>: contents

Obsah Schéma
simpleType Podporovaný.*
complexType Podporovaný.*
unique Ignorovaný.
key Ignorovaný.
keyref Ignorovaný.
(prázdné) Podporovan.

* Při použití simpleType a complexType, mapování pro anonymní typy je stejné jako pro neanonymní typy, s výjimkou, že neexistují žádné anonymní datové kontrakty, a proto je vytvořen pojmenovaný datový kontrakt 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 se mapuje na vnitřní typ vnějšího datového kontraktu. Pokud název obsahuje tečky, výsledný datový typ kontraktu je nezávislý (nikoli vnitřní typ).

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

  • Pokud již existuje kontrakt dat s tímto názvem, je název jedinečný přidáním "1", "2", "3" atd., dokud se nevytvořil jedinečný název.

Jednoduché typy – <xs:simpleType>

<xs:simpleType>: atributy

Atribut Schéma
final Ignorovaný.
id Ignorovaný.
name Podporováno, mapuje se na název kontraktu dat.

<xs:simpleType>: obsah

Obsah Schéma
restriction Podporovan. Mapuje se na výčtové kontrakty dat. Tento atribut se ignoruje, pokud neodpovídá vzoru výčtu. xs:simpleType Viz část omezení.
list Podporovan. Mapuje se k označení kontraktů dat výčtu. Podívejte se na xs:simpleType oddíl se seznamy.
union Zakázaný.

<xs:restriction>

  • Omezení komplexního typu jsou podporována pouze pro base="xs:anyType.

  • Jednoduchá omezení xs:string typu, která nemají žádné omezující vlastnosti omezení, než xs:enumeration jsou mapovány na výčtové datové kontrakty.

  • Všechna ostatní omezení jednoduchého typu jsou mapována na typy, které omezují. Například omezení xs:int map na celé číslo, stejně jako xs:int samotné. Další informace o mapování primitivního typu naleznete v tématu Typ/primitivní mapování.

<xs:restriction>: atributy

Atribut Schéma
base Musí být podporovaný jednoduchý typ nebo xs:anyType.
id Ignorovaný.

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

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

Výčet

<xs:restriction> for enumerations: attributes

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

<xs:restriction> for enumerations: contents

Obsah Schéma
simpleType Pokud je k dispozici, musí to být omezení výčtu podporované kontraktem dat (tato část).
minExclusive Ignorovaný.
minInclusive Ignorovaný.
maxExclusive Ignorovaný.
maxInclusive Ignorovaný.
totalDigits Ignorovaný.
fractionDigits Ignorovaný.
length Zakázaný.
minLength Zakázaný.
maxLength Zakázaný.
enumeration Podporovan. Výčet "ID" je ignorován a "hodnota" se mapuje na název hodnoty v kontraktu dat výčtu.
whiteSpace Zakázaný.
pattern Zakázaný.
(prázdné) Podporováno, 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 mapuje na následující schéma podle DataContractSerializer. Pokud jsou hodnoty výčtu začínající od 1, xs:annotation bloky se negenerují.

<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é System.FlagsAttribute k odvození xs:list z xs:string. Nejsou podporovány žádné jiné xs:list varianty.

<xs:list>: atributy

Atribut Schéma
itemType Zakázaný.
id Ignorovaný.

<xs:list>: obsah

Obsah Schéma
simpleType Použití omezující vlastnosti musí být omezené xs:string xs:enumeration .

Pokud hodnota výčtu neodpovídá mocnině 2 progrese (výchozí hodnota pro Příznaky), 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é datové kontrakty se mapují na základ a jsou odvozeny podle typů rozšíření pomocí konstruktoru <xs:extension> schématu XML.

Kontrakt dat nemůže dědit ze 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 datový kontrakt 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>: atributy

Atribut Schéma
id Ignorovaný.
mixed Musí být false.

<xs:complexContent>: obsah

Obsah Schéma
restriction Zakázáno, s výjimkou případů, kdy base="xs:anyType. Tato hodnota je ekvivalentní umístění obsahu xs:restriction přímo do kontejneru xs:complexContent.
extension Podporovan. Mapuje se na dědičnost kontraktů dat.

<xs:extension> v <xs:complexContent>: atributy

Atribut Schéma
id Ignorovaný.
base Podporovan. Mapuje se na typ základního datového kontraktu, ze kterého tento typ dědí.

<xs:extension> v <xs:complexContent>: obsah

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

<xs:sequence> Pokud je k dispozici, jeho členské prvky se mapují na další datové členy, které jsou přítomné v odvozené datové smlouvě.

Pokud odvozený typ obsahuje prvek se stejným názvem jako prvek základního typu, duplicitní deklarace elementu se mapuje na datový člen s názvem vygenerovaným tak, aby byl jedinečný. Kladná celočíselná čísla se přidají do 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 základního datového kontraktu, DataContractSerializer vygeneruje tento odpovídající prvek odvozeného typu.

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

Obě varianty můžou vést ke schématu s nejednoznačným kon režim stanu l, který závisí na pořadí příslušných datových členů.

Mapování typu/primitiv

Pro DataContractSerializer primitivní typy schématu XML se používá následující mapování.

Typ XSD Typ .NET
anyType Object.
anySimpleType String.
duration TimeSpan.
dateTime DateTime.
dateTimeOffset DateTime a TimeSpan pro posun. Viz DateTimeOffset Serializace 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 byla zavedena jako obecný mechanismus serializace objektů pro trvalost nebo přenos dat. Existuje mnoho typů rozhraní .NET Framework, které se implementují ISerializable a které lze předávat mezi aplikacemi. DataContractSerializer přirozeně poskytuje podporu pro ISerializable třídy. Mapuje DataContractSerializer ISerializable typy schémat implementace, které se liší pouze podle QName (kvalifikovaný název) typu a jsou efektivně kolekce vlastností. Například DataContractSerializer mapování 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 továrny musí být součástí kolekce DataContractSerializer známých typů používané instance. Další informace o známýchtypech

Schéma serializace DataContract

Řada schémat exportovaných DataContractSerializer pomocí typů použití, prvků a atributů ze speciálního oboru názvů serializace kontraktů 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.

  • Zmenší valuespace xs:duration se na seřazenou sadu, aby bylo možné ji namapovat na TimeSpan.

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

Import schémat, která nejsou dataContract

DataContractSerializerImportXmlTypes má možnost povolit import schémat, která neodpovídají DataContractSerializer profilu XSD (viz Options vlastnost). Nastavením této možnosti true povolíte přijetí nevyhovujících typů schématu a namapujte je na následující implementaci a IXmlSerializable zabalíte 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

Tento DateTimeOffset typ není považován za primitivní typ. Místo toho se serializuje jako komplexní prvek se dvěma částmi. První část představuje datum a druhá část představuje posun od data a času. Příklad serializované hodnoty DateTimeOffset je uveden 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é