Bagikan melalui


Referensi Skema Kontrak Data

Topik ini menjelaskan subset Skema XML (XSD) yang digunakan oleh DataContractSerializer untuk menjelaskan jenis runtime bahasa umum (CLR) untuk serialisasi XML.

Pemetaan DataContractSerializer

DataContractSerializer memetakan jenis runtime bahasa umum ke XSD saat metadata diekspor dari layanan Windows Communication Foundation (WCF) menggunakan titik akhir metadata atau Alat Utilitas Metadata ServiceModel (Svcutil.exe). Untuk informasi selengkapnya, lihat Serializer Kontrak Data.

DataContractSerializer juga memetakan XSD ke jenis CLR saat Svcutil.exe digunakan untuk mengakses dokumen Bahasa Deskripsi Layanan Web (WSDL) atau XSD dan membuat kontrak data untuk layanan atau klien.

Hanya instans Skema XML yang sesuai dengan persyaratan yang dinyatakan dalam dokumen ini yang dapat dipetakan ke jenis runtime bahasa umum menggunakan DataContractSerializer.

Tingkat Dukungan

DataContractSerializer menyediakan tingkat dukungan berikut untuk fitur Skema XML yang diberikan:

  • Didukung. Ada pemetaan eksplisit dari fitur ini ke jenis atau atribut runtime bahasa umum (atau keduanya) menggunakan DataContractSerializer.

  • Diabaikan. Fitur ini diizinkan dalam skema yang diimpor oleh DataContractSerializer, tetapi tidak berpengaruh pada pembuatan kode.

  • Terlarang. DataContractSerializer tidak mendukung pengimporan skema menggunakan fitur tersebut. Misalnya, Svcutil.exe, saat mengakses WSDL dengan skema yang menggunakan fitur tersebut, kembali menggunakan XmlSerializer sebagai gantinya. Hal ini diatur secara default.

Informasi Umum

  • Namespace layanan skema dijelaskan di Skema XML. Awalan "xs" digunakan dalam dokumen ini.

  • Atribut apa pun dengan namespace layanan non-skema diabaikan.

  • Setiap anotasi (kecuali yang dijelaskan dalam dokumen ini) diabaikan.

<xs:schema>: atribut

Atribut DataContract
attributeFormDefault Diabaikan.
blockDefault Diabaikan.
elementFormDefault Harus memenuhi syarat. Semua elemen harus memenuhi syarat agar skema didukung oleh DataContractSerializer. Ini dapat dicapai dengan menyetel xs:schema/@elementFormDefault ke "qualified" atau dengan menyetel xs:element/@form ke "qualified" pada setiap deklarasi elemen individual.
finalDefault Diabaikan.
Id Diabaikan.
targetNamespace Didukung dan dipetakan ke namespace layanan kontrak data. Jika atribut ini tidak ditentukan, namespace layanan kosong akan digunakan. Tidak boleh berupa namespace layanan http://schemas.microsoft.com/2003/10/Serialization/ yang dipesan.
version Diabaikan.

<xs:schema>: konten

Konten Skema
include Didukung. DataContractSerializer mendukung xs:include dan xs:import. Namun, Svcutil.exe membatasi referensi xs:include/@schemaLocation dan xs:import/@location berikut saat metadata dimuat dari file lokal. Daftar file skema harus melewati mekanisme keluar dari pita dan bukan melalui include dalam kasus ini; includedokumen skema d diabaikan.
redefine Terlarang. Penggunaan xs:redefine dilarang oleh DataContractSerializer karena alasan keamanan: x:redefine memerlukan schemaLocation untuk diikuti. Dalam keadaan tertentu, Svcutil.exe menggunakan DataContract membatasi penggunaan schemaLocation.
import Didukung. DataContractSerializer mendukung xs:include dan xs:import. Namun, Svcutil.exe membatasi referensi xs:include/@schemaLocation dan xs:import/@location berikut saat metadata dimuat dari file lokal. Daftar file skema harus melewati mekanisme keluar dari pita dan bukan melalui include dalam kasus ini; includedokumen skema d diabaikan.
simpleType Didukung. Baca bagian xs:simpleType.
complexType Didukung, memetakan ke kontrak data. Baca bagian xs:complexType.
group Diabaikan. DataContractSerializer tidak mendukung penggunaan xs:group, xs:attributeGroup, dan xs:attribute. Deklarasi ini diabaikan sebagai anak dari xs:schema, tetapi tidak dapat dirujuk dari dalam complexType atau konstruksi lain yang didukung.
attributeGroup Diabaikan. DataContractSerializer tidak mendukung penggunaan xs:group, xs:attributeGroup, dan xs:attribute. Deklarasi ini diabaikan sebagai anak dari xs:schema, tetapi tidak dapat dirujuk dari dalam complexType atau konstruksi lain yang didukung.
element Didukung. Lihat Deklarasi Elemen Global (GED).
attribute Diabaikan. DataContractSerializer tidak mendukung penggunaan xs:group, xs:attributeGroup, dan xs:attribute. Deklarasi ini diabaikan sebagai anak dari xs:schema, tetapi tidak dapat dirujuk dari dalam complexType atau konstruksi lain yang didukung.
notation Diabaikan.

Jenis Kompleks – <xs:complexType>

Informasi Umum

Setiap jenis kompleks <xs:complexType> dipetakan ke kontrak data.

<xs:complexType>: atribut

Atribut Skema
abstract Harus false (default).
block Terlarang.
final Diabaikan.
id Diabaikan.
mixed Harus false (default).
name Didukung dan dipetakan ke nama kontrak data. Jika ada titik dalam nama, upaya dilakukan untuk memetakan jenis ke jenis dalam. Misalnya, tipe kompleks yang dinamai A.B memetakan ke tipe kontrak data yang merupakan tipe dalam dari jenis dengan A nama kontrak data, tetapi hanya jika jenis kontrak data tersebut ada. Lebih dari satu tingkat penyarangan dimungkinkan: misalnya, A.B.C dapat berupa tipe dalam, tetapi hanya jika A dan A.B keduanya ada.

<xs:complexType>: konten

Konten Skema
simpleContent Ekstensi dilarang.

Pembatasan hanya diperbolehkan dari anySimpleType.
complexContent Didukung. Lihat "Warisan".
group Terlarang.
all Terlarang.
choice Terlarang
sequence Didukung, memetakan ke anggota data kontrak data.
attribute Dilarang, bahkan jika use="prohibited" (dengan satu pengecualian). Hanya atribut opsional dari namespace layanan Skema Serialisasi Standar yang didukung. Ini tidak memetakan ke anggota data dalam model pemrograman kontrak data. Saat ini, hanya satu atribut tersebut yang memiliki arti dan dibahas di bagian ISerializable. Yang lain diabaikan.
attributeGroup Terlarang. Dalam rilis WCF v1, DataContractSerializer mengabaikan keberadaan attributeGroup di dalam xs:complexType.
anyAttribute Terlarang.
(kosong) Memetakan ke kontrak data tanpa anggota data.

<xs:sequence> dalam jenis kompleks: atribut

Atribut Skema
id Diabaikan.
maxOccurs Harus 1 (default).
minOccurs Harus 1 (default).

<xs:sequence> dalam jenis kompleks: konten

Konten Skema
element Setiap instans memetakan ke anggota data.
group Terlarang.
choice Terlarang.
sequence Terlarang.
any Terlarang.
(kosong) Memetakan ke kontrak data tanpa anggota data.

Elemen – <xs:element>

Informasi Umum

<xs:element> dapat terjadi dalam konteks berikut:

  • Ini dapat terjadi dalam <xs:sequence>, yang menjelaskan anggota data dari kontrak data reguler (non-kumpulan). Dalam hal ini, atribut maxOccurs harus 1. (Nilai 0 tidak diperbolehkan).

  • Ini dapat terjadi dalam <xs:sequence>, yang menjelaskan anggota data dari kontrak pengumpulan data. Dalam hal ini, atribut maxOccurs harus lebih besar dari 1 atau "tidak terbatas".

  • Ini dapat terjadi dalam <xs:schema> sebagai Deklarasi Elemen Global (GED).

<xs:element> dengan maxOccurs=1 dalam <xs:sequence> (Anggota Data)

Atribut Skema
ref Terlarang.
name Didukung, memetakan ke nama anggota data.
type Didukung, memetakan ke jenis anggota data. Untuk informasi selengkapnya, lihat Pemetaan jenis/primitif. Jika tidak ditentukan (dan elemen tidak berisi jenis anonim), xs:anyType diasumsikan.
block Diabaikan.
default Terlarang.
fixed Terlarang.
form Harus memenuhi syarat. Atribut ini dapat diatur melalui elementFormDefault pada xs:schema.
id Diabaikan.
maxOccurs 1
minOccurs Memetakan ke properti IsRequired dari anggota data (IsRequired benar jika minOccurs adalah 1).
nillable Mempengaruhi pemetaan jenis. Lihat Pemetaan jenis/primitif.

<xs:element> dengan maxOccurs>1 dalam xs <:sequence> (Collections)

Kumpulan dapat berupa jenis berikut:

  • Kumpulan reguler (misalnya, array).

  • Kumpulan kamus (memetakan satu nilai ke nilai lainnya; misalnya, Hashtable).

  • Satu-satunya perbedaan antara kamus dan larik tipe pasangan kunci/nilai adalah pada model pemrograman yang dihasilkan. Ada mekanisme anotasi skema yang dapat digunakan untuk menunjukkan bahwa jenis yang diberikan adalah kumpulan kamus.

Aturan untuk atribut ref, block, default, fixed, form, dan id sama seperti untuk kasus non-kumpulan. Atribut lain termasuk yang ada dalam tabel berikut.

Atribut Skema
name Didukung, memetakan ke properti ItemName di atribut CollectionDataContractAttribute.
type Didukung, memetakan ke jenis yang disimpan dalam kumpulan.
maxOccurs Lebih besar dari 1 atau "tidak terikat". Skema DC harus menggunakan "tidak terikat".
minOccurs Diabaikan.
nillable Mempengaruhi pemetaan jenis. Atribut ini diabaikan untuk kumpulan kamus.

<xs:element> dalam Deklarasi Elemen Global <xs:schema>

  • Deklarasi Elemen Global (GED) yang memiliki nama dan ruang nama yang sama dengan jenis dalam skema, atau yang mendefinisikan jenis anonim di dalamnya, dikatakan terkait dengan jenis tersebut.

  • Ekspor skema: GED terkait dihasilkan untuk setiap jenis yang dihasilkan, baik sederhana maupun kompleks.

  • Deserialisasi/serialisasi: GED terkait digunakan sebagai elemen akar untuk jenis tersebut.

  • Impor skema: GED terkait tidak diperlukan dan diabaikan jika mengikuti aturan berikut (kecuali mereka menentukan jenis).

Atribut Skema
abstract Harus false untuk GED terkait.
block Dilarang dalam GED terkait.
default Dilarang dalam GED terkait.
final Harus false untuk GED terkait.
fixed Dilarang dalam GED terkait.
id Diabaikan.
name Didukung. Lihat definisi GED terkait.
nillable Harus true untuk GED terkait.
substitutionGroup Dilarang dalam GED terkait.
type Didukung, dan harus cocok dengan jenis terkait untuk GED terkait (kecuali elemen berisi jenis anonim).

<xs:element>: konten

Konten Skema
simpleType Didukung.*
complexType Didukung.*
unique Diabaikan.
key Diabaikan.
keyref Diabaikan.
(kosong) Didukung.

* Saat menggunakan pemetaan simpleType dan complexType, untuk jenis anonim sama seperti untuk jenis non-anonim, kecuali bahwa tidak ada kontrak data anonim, sehingga kontrak data yang dinamai dibuat, dengan nama yang dihasilkan berasal dari nama elemen. Aturan untuk jenis anonim ada dalam daftar berikut:

  • Detail implementasi WCF: Jika nama xs:element tidak berisi titik, jenis anonim memetakan ke jenis dalam dari jenis kontrak data luar. Jika nama berisi titik, jenis kontrak data yang dihasilkan bersifat independen (bukan jenis dalam).

  • Nama kontrak data jenis dalam yang dihasilkan adalah nama kontrak data jenis luar diikuti dengan titik, nama elemen, dan string "Jenis".

  • Jika kontrak data dengan nama seperti itu sudah ada, namanya dibuat unik dengan menambahkan "1", "2", "3", dan sebagainya sampai nama unik dibuat.

Jenis Sederhana - <xs:simpleType>

<xs:simpleType>: atribut

Atribut Skema
final Diabaikan.
id Diabaikan.
name Didukung, memetakan ke nama kontrak data.

<xs:simpleType>: konten

Konten Skema
restriction Didukung. Peta ke kontrak data enumerasi. Atribut ini diabaikan jika tidak cocok dengan pola enumerasi. Lihat bagian batasan xs:simpleType.
list Didukung. Memetakan untuk memberi bendera kontrak data enumerasi. Lihat bagian daftar xs:simpleType.
union Terlarang.

<xs:restriction>

  • Pembatasan jenis kompleks hanya didukung untuk base="xs:anyType".

  • Pembatasan jenis sederhana xs:string yang tidak memiliki aspek pembatasan selain xs:enumeration dipetakan ke kontrak data enumerasi.

  • Semua pembatasan jenis sederhana lainnya dipetakan ke jenis yang dibatasi. Misalnya, pembatasan xs:int memetakan ke bilangan bulat, seperti halnya xs:int itu sendiri. Untuk informasi selengkapnya tentang pemetaan jenis primitif, lihat Pemetaan jenis/primitif.

<xs:restriction>: atribut

Atribut Skema
base Harus berupa jenis sederhana yang didukung atau xs:anyType.
id Diabaikan.

<xs:pembatasan> untuk semua kasus lainnya: konten

Konten Skema
simpleType Jika ada, harus berasal dari jenis primitif yang didukung.
minExclusive Diabaikan.
minInclusive Diabaikan.
maxExclusive Diabaikan.
maxInclusive Diabaikan.
totalDigits Diabaikan.
fractionDigits Diabaikan.
length Diabaikan.
minLength Diabaikan.
maxLength Diabaikan.
enumeration Diabaikan.
whiteSpace Diabaikan.
pattern Diabaikan.
(kosong) Didukung.

Enumeration

<xs:pembatasan> untuk enumerasi: atribut

Atribut Skema
base Jika ada, harus xs:string.
id Diabaikan.

<xs:pembatasan> untuk enumerasi: konten

Konten Skema
simpleType Jika ada, harus berupa pembatasan enumerasi yang didukung oleh kontrak data (bagian ini).
minExclusive Diabaikan.
minInclusive Diabaikan.
maxExclusive Diabaikan.
maxInclusive Diabaikan.
totalDigits Diabaikan.
fractionDigits Diabaikan.
length Terlarang.
minLength Terlarang.
maxLength Terlarang.
enumeration Didukung. Enumerasi "id" diabaikan, dan "nilai" dipetakan ke nama nilai dalam kontrak data enumerasi.
whiteSpace Terlarang.
pattern Terlarang.
(kosong) Didukung, peta ke jenis enumerasi kosong.

Kode berikut menunjukkan kelas enumerasi C#.

public enum MyEnum
{
  first = 3,
  second = 4,
  third =5
}

Kelas ini memetakan ke skema berikut oleh DataContractSerializer. Jika nilai enumerasi dimulai dari 1, blok xs:annotation tidak dihasilkan.

<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 memetakan jenis enumerasi yang ditandai dengan System.FlagsAttribute hingga xs:list turunan dari xs:string. Tidak ada variasi xs:list lain yang didukung.

<xs:list>: atribut

Atribut Skema
itemType Terlarang.
id Diabaikan.

<xs:list>: konten

Konten Skema
simpleType Harus dibatasi dari xs:string menggunakan faset xs:enumeration.

Jika nilai enumerasi tidak mengikuti pangkat 2 progresi (default untuk Bendera), nilai disimpan dalam elemen xs:annotation/xs:appInfo/ser:EnumerationValue.

Misalnya, kode berikut menandai jenis enumerasi.

[Flags]
public enum AuthFlags
{
  AuthAnonymous = 1,
  AuthBasic = 2,
  AuthNTLM = 4,
  AuthMD5 = 16,
  AuthWindowsLiveID = 64,
}

Jenis ini memetakan ke skema berikut.

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

Warisan

Aturan umum

Kontrak data dapat diwarisi dari kontrak data lain. Kontrak data tersebut dipetakan ke basis dan diturunkan oleh jenis ekstensi menggunakan konstruksi Skema XML <xs:extension>.

Kontrak data tidak dapat mewarisi dari kontrak data pengumpulan.

Misalnya, kode berikut adalah kontrak data.

[DataContract]
public class Person
{
  [DataMember]
  public string Name;
}
[DataContract]
public class Employee : Person
{
  [DataMember]
  public int ID;
}

Kontrak data ini memetakan ke deklarasi jenis Skema XML berikut.

<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>: atribut

Atribut Skema
id Diabaikan.
mixed Harus false.

<xs:complexContent>: konten

Konten Skema
restriction Dilarang, kecuali saat base=""xs:anyType. Yang terakhir ini setara dengan menempatkan konten xs:restriction langsung di bawah kontainer xs:complexContent.
extension Didukung. Memetakan ke pewarisan kontrak data.

<xs:extension> dalam <xs:complexContent>: atribut

Atribut Skema
id Diabaikan.
base Didukung. Memetakan ke jenis kontrak data dasar yang diwarisi jenis ini.

<xs:extension> di <xs:complexContent>: konten

Aturannya sama dengan untuk konten <xs:complexType>.

Jika <xs:sequence> disediakan, elemen anggotanya dipetakan ke anggota data tambahan yang ada dalam kontrak data turunan.

Jika jenis turunan berisi elemen dengan nama yang sama dengan elemen dalam jenis dasar, deklarasi elemen duplikat dipetakan ke anggota data dengan nama yang dihasilkan menjadi unik. Bilangan bulat positif ditambahkan ke nama anggota data ("member1", "member2", dan seterusnya) sampai nama unik ditemukan. Sebaliknya:

  • Jika kontrak data turunan memiliki anggota data dengan nama dan jenis yang sama sebagai anggota data dalam kontrak data dasar, DataContractSerializer menghasilkan elemen yang sesuai ini dalam jenis turunan.

  • Jika kontrak data turunan memiliki anggota data dengan nama yang sama sebagai anggota data dalam kontrak data dasar tetapi jenis yang berbeda, DataContractSerializer mengimpor skema dengan elemen jenis xs:anyType di jenis dasar dan jenis turunan deklarasi. Nama jenis asli dipertahankan di xs:annotations/xs:appInfo/ser:ActualType/@Name.

Kedua variasi dapat mengarah ke skema dengan model konten yang ambigu, yang bergantung pada urutan anggota data masing-masing.

Pemetaan jenis/primitif

DataContractSerializer menggunakan pemetaan berikut untuk jenis primitif Skema XML.

Jenis XSD Jenis .NET
anyType Object.
anySimpleType String.
duration TimeSpan.
dateTime DateTime.
dateTimeOffset DateTime dan TimeSpan untuk offset. Lihat Serialisasi DateTimeOffset di bawah ini.
time String.
date String.
gYearMonth String.
gYear String.
gMonthDay String.
gDay String.
gMonth String.
boolean Boolean
base64Binary array Byte.
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.

Pemetaan jenis ISerializable

Dalam .NET Framework versi 1.0, ISerializable diperkenalkan sebagai mekanisme umum untuk membuat serial objek untuk persistensi atau transfer data. Ada banyak jenis .NET Framework yang mengimplementasikan ISerializable dan yang dapat diteruskan antar aplikasi. DataContractSerializer secara alami memberikan dukungan untuk kelas ISerializable. Jenis skema implementasi DataContractSerializer memetakan ISerializable yang hanya berbeda berdasarkan QName (nama yang memenuhi syarat) dari jenis dan secara efektif merupakan kumpulan properti. Misalnya, DataContractSerializer memetakan Exception ke jenis XSD berikut di namespace layanan http://schemas.datacontract.org/2004/07/System.

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

Atribut opsional ser:FactoryType yang dideklarasikan dalam skema Serialisasi Kontrak Data merujuk pada kelas pabrik yang dapat membatalkan serialisasi jenis. Kelas pabrik harus menjadi bagian dari kumpulan jenis yang diketahui dari instans DataContractSerializer yang digunakan. Untuk informasi selengkapnya tentang jenis yang diketahui, lihat Jenis Kontrak Data yang Diketahui.

Skema Serialisasi DataContract

Sejumlah skema yang diekspor oleh DataContractSerializer menggunakan jenis, elemen, dan atribut dari namespace Serialisasi Kontrak Data khusus:

http://schemas.microsoft.com/2003/10/Serialization

Berikut ini adalah deklarasi skema Serialisasi Kontrak Data lengkap.

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

Berikut ini harus diperhatikan:

  • ser:char diperkenalkan untuk mewakili karakter Unicode jenis Char.

  • valuespace dari xs:duration dikurangi menjadi kumpulan terurut sehingga dapat dipetakan ke TimeSpan.

  • FactoryType digunakan dalam skema yang diekspor dari jenis turunan dari ISerializable.

Mengimpor skema non-DataContract

DataContractSerializer memiliki opsi ImportXmlTypes untuk mengizinkan impor skema yang tidak sesuai dengan profil DataContractSerializer XSD (lihat properti Options). Mengatur opsi ini ke true memungkinkan penerimaan jenis skema yang tidak sesuai dan memetakannya ke implementasi berikut, IXmlSerializable menggabungkan array XmlNode (hanya nama kelas yang berbeda).

[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;
  }
}

Serialisasi DateTimeOffset

DateTimeOffset tidak diperlakukan sebagai jenis primitif. Sebaliknya, ini diserialisasikan sebagai elemen kompleks dengan dua bagian. Bagian pertama mewakili waktu tanggal, dan bagian kedua mewakili offset dari waktu tanggal. Contoh nilai DateTimeOffset berseri diperlihatkan dalam kode berikut.

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

Skemanya adalah sebagai berikut.

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

Lihat juga