Udostępnij za pośrednictwem


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 DataContractSerializerelement , 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 DataContractSerializerprogram . 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; includedokumenty 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; includedokumenty 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:attributeGroupi xs:attribute. Te deklaracje są ignorowane jako elementy podrzędne xs:schemaprogramu , 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:attributeGroupi xs:attribute. Te deklaracje są ignorowane jako elementy podrzędne xs:schemaprogramu , 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:attributeGroupi xs:attribute. Te deklaracje są ignorowane jako elementy podrzędne xs:schemaprogramu , 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 Akontraktu 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:complexTypeelementu .
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 przypadku maxOccurs 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 przypadku maxOccurs 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)

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, , blockformdefaultfixedi 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 complexTypemapowanie 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 jak xs: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 typu xs:anyType zarówno w deklaracji typu podstawowego, jak i pochodnego. Oryginalna nazwa typu jest zachowywana w pliku xs: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

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

Zobacz też