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. DataContractSerializer nepodporuje použití , xs:group xs:attributeGroup a xs:attribute . Tyto deklarace se ignorují jako podřízené objekty , xs:schema ale nelze na ni odkazovat v rámci complexType ani jiné podporované konstruktory. |
attributeGroup |
Ignorovány. DataContractSerializer nepodporuje použití , xs:group xs:attributeGroup a xs:attribute . Tyto deklarace se ignorují jako podřízené objekty , xs:schema ale nelze na ni odkazovat v rámci complexType ani jiné podporované konstruktory. |
element |
Podporuje se. Viz GED (Global Element Declaration). |
attribute |
Ignorovány. DataContractSerializer nepodporuje použití , xs:group xs:attributeGroup a xs:attribute . Tyto deklarace se ignorují jako podřízené objekty , xs:schema ale 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 A kontraktu 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 A A.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ř attributeGroup xs: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)
Mapuje se na CollectionDataContractAttribute.
V typech kolekcí je v rámci sekvence xs:element povolen pouze jeden xs:element.
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 ref
atributy , , block
, default
, fixed
form
a 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ě jakoxs: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:string xs: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 typuxs: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 DataContractSerializer
ISerializable
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
ofxs: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
DataContractSerializer
ImportXmlTypes
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>