Odwołanie do schematu kontraktu danych
W tym temacie opisano podzestaw schematu XML (XSD) używanego przez DataContractSerializer program do opisywania typów środowiska uruchomieniowego języka wspólnego (CLR) na potrzeby serializacji XML.
Mapowania elementu DataContractSerializer
Typy DataContractSerializer
CLR są mapowane na XSD, gdy metadane są eksportowane z usługi Windows Communication Foundation (WCF) przy użyciu punktu końcowego metadanych lub narzędzia ServiceModel Metadata Tool (Svcutil.exe). Aby uzyskać więcej informacji, zobacz Serializator kontraktu danych.
Ponadto DataContractSerializer
mapuje XSD na typy CLR, gdy Svcutil.exe jest używany do uzyskiwania dostępu do usług sieci Web Description Language (WSDL) lub dokumentów XSD i generowania kontraktów danych dla usług lub klientów.
Tylko wystąpienia schematu XML zgodne z wymaganiami określonymi w tym dokumencie można mapować na typy CLR przy użyciu polecenia DataContractSerializer
.
Poziomy pomocy technicznej
Program DataContractSerializer
zapewnia następujące poziomy obsługi dla danej funkcji schematu XML:
Obsługiwane. Istnieje jawne mapowanie z tej funkcji na typy lub atrybuty CLR (lub oba) przy użyciu polecenia
DataContractSerializer
.Ignorowane. Funkcja jest dozwolona w schematach importowanych przez
DataContractSerializer
element , ale nie ma wpływu na generowanie kodu.Zabronione. Obiekt
DataContractSerializer
nie obsługuje importowania schematu przy użyciu funkcji . Na przykład Svcutil.exe podczas uzyskiwania dostępu do języka WSDL za pomocą schematu, który używa takiej funkcji, wraca do używania elementu XmlSerializer . Jest to domyślnie.
Informacje ogólne
Przestrzeń nazw schematu jest opisana w temacie Schemat XML. Prefiks "xs" jest używany w tym dokumencie.
Wszystkie atrybuty z przestrzenią nazw innych niż schemat są ignorowane.
Wszelkie adnotacje (z wyjątkiem adnotacji opisanych w tym dokumencie) są ignorowane.
<xs:schema>: atrybuty
Atrybut | DataContract |
---|---|
attributeFormDefault |
Ignorowane. |
blockDefault |
Ignorowane. |
elementFormDefault |
Musi być kwalifikowana. Wszystkie elementy muszą być kwalifikowane, aby schemat był obsługiwany przez DataContractSerializer program . Można to zrobić, ustawiając wartość xs:schema/@elementFormDefault na "kwalifikowaną" lub ustawiając wartość xs:element/@form na "kwalifikowaną" dla każdej deklaracji poszczególnych elementów. |
finalDefault |
Ignorowane. |
Id |
Ignorowane. |
targetNamespace |
Obsługiwane i mapowane na przestrzeń nazw kontraktu danych. Jeśli ten atrybut nie zostanie określony, zostanie użyta pusta przestrzeń nazw. Nie można być zarezerwowaną przestrzenią nazw http://schemas.microsoft.com/2003/10/Serialization/ . |
version |
Ignorowane. |
<xs:schema>: zawartość
Zawartość | Schemat |
---|---|
include |
Obsługiwane. DataContractSerializer program obsługuje pliki xs:include i xs:import. Jednak Svcutil.exe ogranicza następujące xs:include/@schemaLocation i xs:import/@location odwołania, gdy metadane są ładowane z pliku lokalnego. Lista plików schematu musi być przekazywana przez mechanizm poza pasmem, a nie przez include ten przypadek; include dokumenty schematu d są ignorowane. |
redefine |
Zakazany. Korzystanie z usługi xs:redefine jest zabronione ze DataContractSerializer względów bezpieczeństwa: x:redefine należy schemaLocation postępować zgodnie z wymaganiami. W pewnych okolicznościach Svcutil.exe użycie obiektu DataContract ogranicza użycie elementu schemaLocation . |
import |
Obsługiwane. DataContractSerializer program obsługuje i xs:include xs:import . Jednak Svcutil.exe ogranicza następujące xs:include/@schemaLocation i xs:import/@location odwołania, gdy metadane są ładowane z pliku lokalnego. Lista plików schematu musi być przekazywana przez mechanizm poza pasmem, a nie przez include ten przypadek; include dokumenty schematu d są ignorowane. |
simpleType |
Obsługiwane. Zobacz sekcję xs:simpleType . |
complexType |
Obsługiwane, mapuje na kontrakty danych. Zobacz sekcję xs:complexType . |
group |
Ignorowane. DataContractSerializer nie obsługuje używania elementów xs:group , xs:attributeGroup i xs:attribute . Te deklaracje są ignorowane jako elementy podrzędne xs:schema programu , ale nie mogą być przywoływane z wewnątrz complexType ani innych obsługiwanych konstrukcji. |
attributeGroup |
Ignorowane. DataContractSerializer nie obsługuje używania elementów xs:group , xs:attributeGroup i xs:attribute . Te deklaracje są ignorowane jako elementy podrzędne xs:schema programu , ale nie mogą być przywoływane z wewnątrz complexType ani innych obsługiwanych konstrukcji. |
element |
Obsługiwane. Zobacz Deklarację elementu globalnego (GED). |
attribute |
Ignorowane. DataContractSerializer nie obsługuje używania elementów xs:group , xs:attributeGroup i xs:attribute . Te deklaracje są ignorowane jako elementy podrzędne xs:schema programu , ale nie mogą być przywoływane z wewnątrz complexType ani innych obsługiwanych konstrukcji. |
notation |
Ignorowane. |
Typy złożone — <xs:complexType>
Informacje ogólne
Każdy typ <złożony xs:complexType> mapuje na kontrakt danych.
<xs:complexType>: atrybuty
Atrybut | Schemat |
---|---|
abstract |
Musi być fałsz (wartość domyślna). |
block |
Zakazany. |
final |
Ignorowane. |
id |
Ignorowane. |
mixed |
Musi być fałsz (wartość domyślna). |
name |
Obsługiwane i mapowane na nazwę kontraktu danych. Jeśli w nazwie występują kropki, podjęto próbę mapowania typu na typ wewnętrzny. Na przykład typ złożony o nazwie A.B mapuje na typ kontraktu danych, który jest typem wewnętrznym typu o nazwie A kontraktu danych , ale tylko wtedy, gdy taki typ kontraktu danych istnieje. Istnieje więcej niż jeden poziom zagnieżdżania: na przykład A.B.C może być typem wewnętrznym, ale tylko wtedy, gdy A istnieją i A.B oba te elementy. |
<xs:complexType>: zawartość
Zawartość | Schemat |
---|---|
simpleContent |
Rozszerzenia są zabronione. Ograniczenie jest dozwolone tylko z anySimpleType . |
complexContent |
Obsługiwane. Zobacz "Dziedziczenie". |
group |
Zakazany. |
all |
Zakazany. |
choice |
Dostęp zabroniony |
sequence |
Obsługiwane, mapuje na składowe danych kontraktu danych. |
attribute |
Zabronione, nawet jeśli use="bidden" (z jednym wyjątkiem). Obsługiwane są tylko opcjonalne atrybuty z przestrzeni nazw schematu serializacji standardowej. Nie są mapować na składowe danych w modelu programowania kontraktów danych. Obecnie tylko jeden taki atrybut ma znaczenie i jest omówiony w sekcji ISerializable. Wszystkie inne są ignorowane. |
attributeGroup |
Zakazany. W wersji DataContractSerializer WCF w wersji 1 ignoruje obecność attributeGroup wewnątrz xs:complexType elementu . |
anyAttribute |
Zakazany. |
(puste) | Mapuje na kontrakt danych bez elementów członkowskich danych. |
<xs:sequence> w typie złożonym: atrybuty
Atrybut | Schemat |
---|---|
id |
Ignorowane. |
maxOccurs |
Musi mieć wartość 1 (wartość domyślna). |
minOccurs |
Musi mieć wartość 1 (wartość domyślna). |
<xs:sequence> w typie złożonym: zawartość
Zawartość | Schemat |
---|---|
element |
Każde wystąpienie jest mapowe na element członkowski danych. |
group |
Zakazany. |
choice |
Zakazany. |
sequence |
Zakazany. |
any |
Zakazany. |
(puste) | Mapuje na kontrakt danych bez elementów członkowskich danych. |
Elements — <xs:element>
Informacje ogólne
<xs:element>
może wystąpić w następujących kontekstach:
Może to nastąpić w obrębie
<xs:sequence>
obiektu , który opisuje element członkowski danych zwykłego (niezwiązanego z zbieraniem) kontraktu danych. W takim przypadkumaxOccurs
atrybut musi mieć wartość 1. (Wartość 0 jest niedozwolona).Może to nastąpić w obrębie
<xs:sequence>
obiektu , który opisuje element członkowski danych w umowie danych zbierania. W takim przypadkumaxOccurs
atrybut musi być większy niż 1 lub "bez ruchu".Może wystąpić w ramach
<xs:schema>
deklaracji elementu globalnego (GED).
<xs:element> with maxOccurs=1 w obrębie <xs:sequence> (składowe danych)
Atrybut | Schemat |
---|---|
ref |
Zakazany. |
name |
Obsługiwane mapuje nazwę elementu członkowskiego danych. |
type |
Obsługiwane, mapuje na typ elementu członkowskiego danych. Aby uzyskać więcej informacji, zobacz Mapowanie typu/pierwotnego. Jeśli nie określono (a element nie zawiera typu anonimowego), xs:anyType przyjmuje się założenie. |
block |
Ignorowane. |
default |
Zakazany. |
fixed |
Zakazany. |
form |
Musi być kwalifikowana. Ten atrybut można ustawić za pomocą elementu elementFormDefault na .xs:schema |
id |
Ignorowane. |
maxOccurs |
1 |
minOccurs |
Mapuje na IsRequired właściwość elementu członkowskiego danych (IsRequired ma wartość true, gdy minOccurs ma wartość 1). |
nillable |
Wpływa na mapowanie typów. Zobacz Mapowanie typu/pierwotnego. |
<xs:element> z wartością maxOccurs>1 w obiekcie <xs:sequence> (kolekcje)
Mapuje na CollectionDataContractAttribute.
W typach kolekcji tylko jeden element xs:element jest dozwolony w obrębie xs:sequence.
Kolekcje mogą być następującymi typami:
Zwykłe kolekcje (na przykład tablice).
Kolekcje słowników (mapowanie jednej wartości na inną Hashtable, na przykład ).
Jedyną różnicą między słownikiem a tablicą typu pary klucz/wartość jest wygenerowany model programowania. Istnieje mechanizm adnotacji schematu, który może służyć do wskazywania, że dany typ jest kolekcją słowników.
Reguły atrybutów ref
, , block
form
default
fixed
i id
są takie same jak w przypadku przypadku wielkości liter innych niż kolekcja. Inne atrybuty obejmują te w poniższej tabeli.
Atrybut | Schemat |
---|---|
name |
Obsługiwane, mapuje na ItemName właściwość w atrybucie CollectionDataContractAttribute . |
type |
Obsługiwane mapowanie na typ przechowywany w kolekcji. |
maxOccurs |
Większe niż 1 lub "bez ruchu". Schemat kontrolera domeny powinien używać "bez ruchu". |
minOccurs |
Ignorowane. |
nillable |
Wpływa na mapowanie typów. Ten atrybut jest ignorowany dla kolekcji słowników. |
<xs:element> w deklaracji elementu globalnego <xs:schema>
Deklaracja elementu globalnego (GED), która ma taką samą nazwę i przestrzeń nazw, jak typ w schemacie, lub który definiuje anonimowy typ wewnątrz siebie, mówi się, że jest skojarzony z typem.
Eksport schematu: skojarzone dyski GED są generowane dla każdego wygenerowanego typu, zarówno prostego, jak i złożonego.
Deserializacja/serializacja: skojarzone dyski GED są używane jako elementy główne dla typu.
Importowanie schematu: skojarzone dyski GED nie są wymagane i są ignorowane, jeśli są zgodne z następującymi regułami (chyba że definiują typy).
Atrybut | Schemat |
---|---|
abstract |
Musi być fałszem dla skojarzonych dysków GED. |
block |
Zabronione w skojarzonych gedach. |
default |
Zabronione w skojarzonych gedach. |
final |
Musi być fałszem dla skojarzonych dysków GED. |
fixed |
Zabronione w skojarzonych gedach. |
id |
Ignorowane. |
name |
Obsługiwane. Zobacz definicję skojarzonych dysków GED. |
nillable |
Musi mieć wartość true dla skojarzonych dysków GED. |
substitutionGroup |
Zabronione w skojarzonych gedach. |
type |
Obsługiwane i muszą być zgodne ze skojarzonym typem skojarzonych dysków GED (chyba że element zawiera typ anonimowy). |
<xs:element>: contents
Zawartość | Schemat |
---|---|
simpleType |
Obsługiwane.* |
complexType |
Obsługiwane.* |
unique |
Ignorowane. |
key |
Ignorowane. |
keyref |
Ignorowane. |
(puste) | Obsługiwane. |
* W przypadku używania parametrów simpleType
i complexType
mapowanie dla typów anonimowych jest takie samo jak w przypadku typów innych niż anonimowe, z tą różnicą, że nie ma żadnych anonimowych kontraktów danych, a więc jest tworzona nazwa danych wygenerowana na podstawie nazwy elementu. Reguły dla typów anonimowych znajdują się na następującej liście:
Szczegóły implementacji programu WCF: jeśli
xs:element
nazwa nie zawiera kropek, typ anonimowy jest mapowy na wewnętrzny typ zewnętrznego typu kontraktu danych. Jeśli nazwa zawiera kropki, wynikowy typ kontraktu danych jest niezależny (a nie typ wewnętrzny).Wygenerowana nazwa kontraktu danych typu wewnętrznego to nazwa kontraktu danych typu zewnętrznego, po którym następuje kropka, nazwa elementu i ciąg "Typ".
Jeśli kontrakt danych o takiej nazwie już istnieje, nazwa jest unikatowa, dołączając ciąg "1", "2", "3" itd., dopóki nie zostanie utworzona unikatowa nazwa.
Proste typy — <xs:simpleType>
<xs:simpleType>: atrybuty
Atrybut | Schemat |
---|---|
final |
Ignorowane. |
id |
Ignorowane. |
name |
Obsługiwane, mapuje na nazwę kontraktu danych. |
<xs:simpleType>: zawartość
Zawartość | Schemat |
---|---|
restriction |
Obsługiwane. Mapuje na kontrakty danych wyliczania. Ten atrybut jest ignorowany, jeśli nie jest zgodny ze wzorcem wyliczania. Zobacz sekcję xs:simpleType ograniczenia. |
list |
Obsługiwane. Mapuje na flagę kontrakty danych wyliczania. Zobacz sekcję xs:simpleType listy. |
union |
Zakazany. |
<xs:ograniczenie>
Ograniczenia typów złożonych są obsługiwane tylko dla base="
xs:anyType
".Proste ograniczenia
xs:string
typów, które nie mają żadnych aspektów ograniczeń innych niżxs:enumeration
są mapowane na kontrakty danych wyliczania.Wszystkie inne proste ograniczenia typów są mapowane na typy, które ograniczają. Na przykład ograniczenie map do liczby całkowitej
xs:int
, tak jakxs:int
samo w sobie. Aby uzyskać więcej informacji na temat mapowania typów pierwotnych, zobacz Mapowanie typu/pierwotnego.
<xs:restriction>: attributes
Atrybut | Schemat |
---|---|
base |
Musi być obsługiwanym prostym typem lub xs:anyType . |
id |
Ignorowane. |
<xs:ograniczenie> dla wszystkich innych przypadków: zawartość
Zawartość | Schemat |
---|---|
simpleType |
Jeśli istnieje, musi pochodzić z obsługiwanego typu pierwotnego. |
minExclusive |
Ignorowane. |
minInclusive |
Ignorowane. |
maxExclusive |
Ignorowane. |
maxInclusive |
Ignorowane. |
totalDigits |
Ignorowane. |
fractionDigits |
Ignorowane. |
length |
Ignorowane. |
minLength |
Ignorowane. |
maxLength |
Ignorowane. |
enumeration |
Ignorowane. |
whiteSpace |
Ignorowane. |
pattern |
Ignorowane. |
(puste) | Obsługiwane. |
Wyliczanie
<xs:ograniczenie> dla wyliczenia: atrybuty
Atrybut | Schemat |
---|---|
base |
Jeśli jest obecny, musi mieć wartość xs:string . |
id |
Ignorowane. |
<xs:ograniczenie> dla wyliczenia: zawartość
Zawartość | Schemat |
---|---|
simpleType |
Jeśli istnieje, musi być ograniczeniem wyliczenia obsługiwanym przez kontrakt danych (ta sekcja). |
minExclusive |
Ignorowane. |
minInclusive |
Ignorowane. |
maxExclusive |
Ignorowane. |
maxInclusive |
Ignorowane. |
totalDigits |
Ignorowane. |
fractionDigits |
Ignorowane. |
length |
Zakazany. |
minLength |
Zakazany. |
maxLength |
Zakazany. |
enumeration |
Obsługiwane. Wyliczenie "id" jest ignorowane, a wartość jest mapowana na nazwę wartości w kontrakcie danych wyliczania. |
whiteSpace |
Zakazany. |
pattern |
Zakazany. |
(puste) | Obsługiwane, mapuje na pusty typ wyliczenia. |
Poniższy kod przedstawia klasę wyliczenia języka C#.
public enum MyEnum
{
first = 3,
second = 4,
third =5
}
Ta klasa jest mapowany na następujący schemat za pomocą klasy DataContractSerializer
. Jeśli wartości wyliczenia zaczynają się od 1, xs:annotation
bloki nie są generowane.
<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 wyliczenia oznaczone System.FlagsAttribute
jako na pochodne xs:list
z xs:string
. Nie są obsługiwane żadne inne xs:list
odmiany.
<xs:list>: atrybuty
Atrybut | Schemat |
---|---|
itemType |
Zakazany. |
id |
Ignorowane. |
<xs:list>: zawartość
Zawartość | Schemat |
---|---|
simpleType |
Musi być ograniczenie korzystania xs:enumeration z xs:string aspektów. |
Jeśli wartość wyliczenia nie ma mocy 2 progresji (wartość domyślna dla flag), wartość jest przechowywana w elemecie xs:annotation/xs:appInfo/ser:EnumerationValue
.
Na przykład poniższy kod flaguje typ wyliczenia.
[Flags]
public enum AuthFlags
{
AuthAnonymous = 1,
AuthBasic = 2,
AuthNTLM = 4,
AuthMD5 = 16,
AuthWindowsLiveID = 64,
}
Ten typ jest mapowy na następujący schemat.
<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>
Dziedziczenie
Reguły ogólne
Kontrakt danych może dziedziczyć z innego kontraktu danych. Takie kontrakty danych są mapowane na bazę i są tworzone przez typy rozszerzeń przy użyciu konstrukcji schematu <xs:extension>
XML.
Kontrakt danych nie może dziedziczyć z kontraktu danych kolekcji.
Na przykład poniższy kod to kontrakt danych.
[DataContract]
public class Person
{
[DataMember]
public string Name;
}
[DataContract]
public class Employee : Person
{
[DataMember]
public int ID;
}
Ten kontrakt danych jest mapowy na następującą deklarację typu schematu 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>: atrybuty
Atrybut | Schemat |
---|---|
id |
Ignorowane. |
mixed |
Musi być fałsz. |
<xs:complexContent>: zawartość
Zawartość | Schemat |
---|---|
restriction |
Zabronione, z wyjątkiem sytuacji, gdy base="xs:anyType ". Ten ostatni jest odpowiednikiem umieszczania zawartości xs:restriction obiektu bezpośrednio pod kontenerem obiektu xs:complexContent . |
extension |
Obsługiwane. Mapuje na dziedziczenie kontraktu danych. |
<xs:extension> in <xs:complexContent>: attributes
Atrybut | Schemat |
---|---|
id |
Ignorowane. |
base |
Obsługiwane. Mapuje na podstawowy typ kontraktu danych dziedziczony przez ten typ. |
<xs:extension> in <xs:complexContent>: contents
Reguły są takie same jak w przypadku <xs:complexType>
zawartości.
Jeśli element <xs:sequence>
jest podany, jego elementy członkowskie są mapowane na dodatkowe elementy członkowskie danych, które znajdują się w kontrakcie danych pochodnych.
Jeśli typ pochodny zawiera element o takiej samej nazwie jak element w typie podstawowym, zduplikowana deklaracja elementu jest mapowana na składową danych o nazwie, która jest generowana jako unikatowa. Dodatnie liczby całkowite są dodawane do nazwy składowej danych ("member1", "member2" itd.), dopóki nie zostanie znaleziona unikatowa nazwa. Odwrotnie:
Jeśli kontrakt danych pochodnych ma element członkowski danych o tej samej nazwie i typie co element członkowski danych w kontrakcie danych podstawowych,
DataContractSerializer
generuje ten odpowiedni element w typie pochodnym.Jeśli kontrakt danych pochodnych ma element członkowski danych o takiej samej nazwie jak element członkowski danych w kontrakcie danych podstawowych, ale inny typ,
DataContractSerializer
importuje schemat z elementem typuxs:anyType
zarówno w deklaracji typu podstawowego, jak i pochodnego. Oryginalna nazwa typu jest zachowywana w plikuxs:annotations/xs:appInfo/ser:ActualType/@Name
.
Obie odmiany mogą prowadzić do schematu z niejednoznacznym con tryb namiotu l, który zależy od kolejności odpowiednich elementów członkowskich danych.
Mapowanie typu/pierwotnego
Używa DataContractSerializer
następującego mapowania dla typów pierwotnych schematu XML.
Typ XSD | Typ platformy .NET |
---|---|
anyType |
Object. |
anySimpleType |
String. |
duration |
TimeSpan. |
dateTime |
DateTime. |
dateTimeOffset |
DateTime i TimeSpan dla przesunięcia. Zobacz Serializacja DateTimeOffset poniżej. |
time |
String. |
date |
String. |
gYearMonth |
String. |
gYear |
String. |
gMonthDay |
String. |
gDay |
String. |
gMonth |
String. |
boolean |
Boolean |
base64Binary |
Byte tablica. |
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. |
Mapowanie typów ISerializable
W programie .NET Framework w wersji 1.0 ISerializable wprowadzono ogólny mechanizm serializacji obiektów na potrzeby trwałości lub transferu danych. Istnieje wiele typów programu .NET Framework, które implementują ISerializable
i które mogą być przekazywane między aplikacjami. DataContractSerializer naturalnie zapewnia obsługę ISerializable
klas. Mapuje DataContractSerializer
ISerializable
typy schematów implementacji, które różnią się tylko przez QName (kwalifikowaną nazwę) typu i są skutecznie kolekcjami właściwości. Na przykład mapuje DataContractSerializer
Exception na następujący typ XSD w http://schemas.datacontract.org/2004/07/System
przestrzeni nazw.
<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>
Opcjonalny atrybut ser:FactoryType
zadeklarowany w schemacie Serializacji kontraktu danych odwołuje się do klasy fabryki, która może deserializować typ. Klasa fabryki musi być częścią znanej kolekcji typów używanego DataContractSerializer
wystąpienia. Aby uzyskać więcej informacji na temat znanych typów, zobacz Znane typy kontraktów danych.
Schemat serializacji DataContract
Wiele schematów eksportowanych przez DataContractSerializer
typy użycia, elementy i atrybuty z specjalnej przestrzeni nazw serializacji kontraktu danych:
http://schemas.microsoft.com/2003/10/Serialization
Poniżej znajduje się kompletna deklaracja schematu serializacji kontraktu danych.
<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>
Należy zauważyć następujące kwestie:
ser:char
wprowadzono do reprezentowania znaków Unicode typu Char.Element jest
valuespace
xs:duration
zredukowany do uporządkowanego zestawu, aby można było go zamapować na TimeSpanelement .FactoryType
jest używany w schematach eksportowanych z typów, które pochodzą z ISerializableklasy .
Importowanie schematów innych niż DataContract
DataContractSerializer
ImportXmlTypes
Ma opcję zezwalania na importowanie schematów, które nie są zgodne z DataContractSerializer
profilem XSD (zobacz Options właściwość). Ustawienie tej opcji w celu true
umożliwienia akceptacji niezgodnych typów schematów i mapowanie ich na następującą implementację, IXmlSerializable opakowywanie tablicy XmlNode (różni się tylko nazwa klasy).
[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;
}
}
Serializacja DateTimeOffset
Element DateTimeOffset nie jest traktowany jako typ pierwotny. Zamiast tego jest serializowany jako złożony element z dwiema częściami. Pierwsza część reprezentuje godzinę daty, a druga część reprezentuje przesunięcie z daty i godziny. Przykład zserializowanej wartości DateTimeOffset jest pokazany w poniższym kodzie.
<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>
Schemat jest następujący.
<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>