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ě; include Dokumenty 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ě; include Dokumenty 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ý. DataContractSerializer nepodporuje použití , xs:group xs:attributeGroup a 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ý. DataContractSerializer nepodporuje použití , xs:group xs:attributeGroup a 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ý. DataContractSerializer nepodporuje použití , xs:group xs:attributeGroup a 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 A datové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)
Mapuje na .CollectionDataContractAttribute
V typech kolekcí je v rámci xs:sequence povolen pouze jeden prvek xs:element.
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 ref
objekty , , default
form
block
fixed
a 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ě jakoxs: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 typuxs:anyType
v deklarací základního typu i odvozeného typu. Původní název typu je zachován vxs:annotations/xs:appInfo/ser:ActualType/@Name
souboru .
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
DataContractSerializer
ImportXmlTypes
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>