Bagikan melalui


Jenis XML dan ADO.NET dalam Kontrak Data

Model kontrak data Windows Communication Foundation (WCF) mendukung jenis tertentu yang mewakili XML secara langsung. Ketika jenis ini diserialisasikan ke XML, serializer menulis konten XML dari jenis ini tanpa pemrosesan lebih lanjut. Jenis yang didukung adalah XmlElement, array XmlNode (tetapi bukan jenis XmlNode itu sendiri), serta jenis yang mengimplementasikan IXmlSerializable. Jenis DataSet dan DataTable, serta himpunan data berjenis, umumnya digunakan dalam pemrograman database. Jenis-jenis ini mengimplementasikan antarmuka IXmlSerializable dan oleh karena itu dapat diserialisasikan dalam model kontrak data. Beberapa pertimbangan khusus untuk jenis ini tercantum di akhir topik ini.

Jenis XML

Elemen XML

Jenis XmlElement diserialisasikan menggunakan konten XML-nya. Misalnya, menggunakan jenis berikut.

[DataContract(Namespace=@"http://schemas.contoso.com")]
public class MyDataContract
{
    [DataMember]
    public XmlElement myDataMember;
    public void TestClass()
    {
        XmlDocument xd = new XmlDocument();
        myDataMember = xd.CreateElement("myElement");
        myDataMember.InnerText = "myContents";
        myDataMember.SetAttribute
         ("myAttribute","myValue");
    }
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
    <DataMember()> _
    Public myDataMember As XmlElement

    Public Sub TestClass()
        Dim xd As New XmlDocument()
        myDataMember = xd.CreateElement("myElement")
        myDataMember.InnerText = "myContents"
        myDataMember.SetAttribute("myAttribute", "myValue")

    End Sub
End Class

Jenis ini diserialisasikan ke XML sebagai berikut:

<MyDataContract xmlns="http://schemas.contoso.com">  
    <myDataMember>  
        <myElement xmlns="" myAttribute="myValue">  
            myContents  
        </myElement>  
    </myDataMember>  
</MyDataContract>  

Perhatikan bahwa elemen <myDataMember> anggota data penyelubung masih ada. Tidak ada cara untuk menghapus elemen ini dalam model kontrak data. Serializer yang menangani model ini (DataContractSerializer dan NetDataContractSerializer) dapat memancarkan atribut khusus ke dalam elemen penyelubung ini. Atribut ini termasuk atribut "nil" Instans Skema XML standar (memungkinkan XmlElement menjadi null ) dan atribut "jenis" (memungkinkan XmlElement untuk digunakan secara polimorfik). Selain itu, atribut XML berikut khusus untuk WCF: "Id", "Ref", "Type" dan "Assembly". Atribut ini dapat dipancarkan untuk mendukung penggunaan XmlElement dengan mode pelestarian grafik objek diaktifkan, atau dengan NetDataContractSerializer. (Untuk informasi selengkapnya tentang mode pelestarian grafik objek, lihat Serialisasi dan Deserialisasi.)

Array atau koleksi XmlElement diizinkan dan ditangani sebagai array atau koleksi lainnya. Artinya, ada elemen pembungkus untuk seluruh koleksi, dan elemen pembungkus terpisah (mirip <myDataMember> dengan dalam contoh sebelumnya) untuk masing-masing XmlElement dalam array.

Pada deserialisasi, XmlElement dibuat oleh deserializer dari XML masuk. Induk XmlDocument yang valid disediakan oleh deserializer.

Pastikan bahwa fragmen XML yang dideserialisasi ke XmlElement menentukan semua awalan yang digunakannya dan tidak bergantung pada definisi awalan apa pun dari elemen leluhur. Ini hanya menjadi perhatian saat menggunakan DataContractSerializer untuk mengakses XML dari sumber (non-DataContractSerializer) yang berbeda.

Ketika digunakan dengan DataContractSerializer, XmlElement dapat ditetapkan secara polimorfik, tetapi hanya untuk anggota data jenis Object. Meskipun mengimplementasikan IEnumerable, XmlElement tidak dapat digunakan sebagai jenis koleksi dan tidak dapat ditetapkan ke anggota data IEnumerable. Seperti semua penugasan polimorfik, memancarkan DataContractSerializer nama kontrak data dalam XML yang dihasilkan. Dalam hal ini, ini adalah "XmlElement" di http://schemas.datacontract.org/2004/07/System.Xml namespace layanan.

Dengan NetDataContractSerializer, setiap penugasan polimorfik yang valid dari XmlElement (ke Object atau IEnumerable) didukung.

Jangan mencoba menggunakan salah satu serializer dengan jenis yang berasal dari XmlElement, apakah mereka ditetapkan secara polimorfik atau tidak.

Array XmlNode

Penggunaan array XmlNode sangat mirip dengan penggunaan XmlElement. Penggunaan array XmlNode memberi Anda lebih banyak fleksibilitas daripada saat menggunakan XmlElement. Anda dapat menulis beberapa elemen di dalam elemen penyelubung anggota data. Anda juga dapat menyuntikkan konten selain elemen di dalam elemen penyelubung anggota data, seperti komentar XML. Terakhir, Anda dapat memasukkan atribut ke dalam elemen anggota data penyelubung. Semua ini dapat dicapai dengan mengisi array XmlNode dengan kelas turunan XmlNode tertentu seperti XmlAttribute, XmlElement atau XmlComment. Misalnya, menggunakan jenis berikut.

[DataContract(Namespace="http://schemas.contoso.com")]
public class MyDataContract
{
    [DataMember]
    public XmlNode[] myDataMember = new XmlNode[4];
    public void TestClass()
    {
        XmlDocument xd = new XmlDocument();
        XmlElement xe = xd.CreateElement("myElement");
        xe.InnerText = "myContents";
        xe.SetAttribute
         ("myAttribute","myValue");
    
        XmlAttribute atr = xe.Attributes[0];
        XmlComment cmnt = xd.CreateComment("myComment");
        
      myDataMember[0] = atr;
      myDataMember[1] = cmnt;
      myDataMember[2] = xe;
      myDataMember[3] = xe;
    }
}
<DataContract([Namespace]:="http://schemas.contoso.com")> _
Public Class MyDataContract
    <DataMember()> _
    Public myDataMember(3) As XmlNode

    Public Sub TestClass()
        Dim xd As New XmlDocument()
        Dim xe As XmlElement = xd.CreateElement("myElement")
        xe.InnerText = "myContents"
        xe.SetAttribute("myAttribute", "myValue")

        Dim atr As XmlAttribute = xe.Attributes(0)
        Dim cmnt As XmlComment = xd.CreateComment("myComment")

        myDataMember(0) = atr
        myDataMember(1) = cmnt
        myDataMember(2) = xe
        myDataMember(3) = xe

    End Sub

End Class

Saat diserialisasikan, XML yang dihasilkan mirip dengan kode berikut ini.

<MyDataContract xmlns="http://schemas.contoso.com">  
  <myDataMember myAttribute="myValue">  
     <!--myComment-->  
     <myElement xmlns="" myAttribute="myValue">  
 myContents  
     </myElement>  
     <myElement xmlns="" myAttribute="myValue">  
       myContents  
     </myElement>  
  </myDataMember>  
</MyDataContract>  

Perhatikan bahwa elemen <myDataMember> penyelubung anggota data berisi atribut, komentar, dan dua elemen. Ini adalah empat instans XmlNode yang diserialisasikan.

Array XmlNode yang menghasilkan XML yang tidak valid tidak dapat diserialisasikan. Misalnya, array dua instans XmlNode di mana yang pertama adalah XmlElement dan yang kedua adalah XmlAttribute tidak valid, karena urutan ini tidak sesuai dengan instans XML yang valid (tidak ada tempat untuk melampirkan atribut).

Pada deserialisasi array XmlNode, simpul dibuat dan diisi dengan informasi dari XML masuk. Induk XmlDocument yang valid disediakan oleh deserializer. Semua simpul dideserialisasi, termasuk atribut apa pun pada elemen anggota data penyelubung, tetapi tidak termasuk atribut yang ditempatkan di sana oleh serializer WCF (seperti atribut yang digunakan untuk menunjukkan penugasan polimorfik). Peringatan tentang mendefinisikan semua awalan namespace dalam fragmen XML berlaku untuk deserialisasi array XmlNode seperti yang dilakukan untuk deserialisasi XmlElement.

Saat menggunakan serializer dengan pelestarian grafik objek diaktifkan, kesetaraan objek hanya dipertahankan pada tingkat array XmlNode, bukan instans XmlNode individual.

Jangan mencoba menserialisasikan array XmlNode di mana satu atau beberapa simpul diatur ke null. Langkah ini diizinkan untuk seluruh anggota array menjadi null, tetapi tidak untuk setiap individu XmlNode yang terkandung dalam array. Jika seluruh anggota array null, elemen anggota data penyelubung berisi atribut khusus yang menunjukkan bahwa itu null. Pada deserialisasi, seluruh anggota array juga menjadi null.

Hanya array XmlNode reguler yang diperlakukan khusus oleh serializer. Anggota data yang dinyatakan sebagai jenis koleksi lain yang berisi XmlNode, atau anggota data yang dinyatakan sebagai array jenis yang berasal dari XmlNode, tidak diperlakukan secara khusus. Dengan demikian, mereka biasanya tidak dapat diserialisasikan kecuali mereka juga memenuhi salah satu kriteria lain untuk serialisasi.

Array atau koleksi array XmlNode diperbolehkan. Artinya, ada elemen pembungkus untuk seluruh koleksi, dan elemen pembungkus terpisah (mirip <myDataMember> dengan dalam contoh sebelumnya) untuk masing-masing array XmlNode dalam array atau koleksi luar.

Mengisi anggota data dari jenis Array dari Object atau Array dari IEnumerable dengan instans XmlNode tidak mengakibatkan anggota data diperlakukan sebagai Array dari instans XmlNode. Setiap anggota array diserialisasikan secara terpisah.

Ketika digunakan dengan DataContractSerializer, array XmlNode dapat ditetapkan secara polimorfik, tetapi hanya untuk anggota data jenis Object. Meskipun mengimplementasikan IEnumerable, array XmlNode tidak dapat digunakan sebagai jenis koleksi dan tidak dapat ditetapkan ke anggota data IEnumerable. Seperti semua penugasan polimorfik, DataContractSerializer memancarkan nama kontrak data dalam XML yang dihasilkan - dalam hal ini, itu adalah "ArrayOfXmlNode" di http://schemas.datacontract.org/2004/07/System.Xml namespace. Saat digunakan dengan NetDataContractSerializer, setiap penugasan array XmlNode yang valid didukung.

Pertimbangan Skema

Untuk detail tentang pemetaan skema jenis XML, lihat Referensi Skema Kontrak Data. Bagian ini menyediakan ringkasan poin penting.

Anggota data jenis XmlElement dipetakan ke elemen yang ditentukan menggunakan jenis anonim berikut.

<xsd:complexType>  
   <xsd:sequence>  
      <xsd:any minOccurs="0" processContents="lax" />  
   </xsd:sequence>  
</xsd:complexType>  

Anggota data jenis Array XmlNode dipetakan ke elemen yang ditentukan menggunakan jenis anonim berikut.

<xsd:complexType mixed="true">  
   <xsd:sequence>  
      <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />  
   </xsd:sequence>  
   <xsd:anyAttribute/>  
</xsd:complexType>  

Jenis yang Mengimplementasikan Antarmuka IXmlSerializable

Jenis yang mengimplementasikan antarmuka IXmlSerializable sepenuhnya didukung oleh DataContractSerializer. Atribut XmlSchemaProviderAttribute harus selalu diterapkan ke jenis-jenis ini untuk mengontrol skemanya.

Ada tiga macam jenis yang mengimplementasikan IXmlSerializable: jenis yang mewakili konten arbitrer, jenis yang mewakili elemen tunggal, dan jenis DataSet lama.

  • Jenis konten menggunakan metode penyedia skema yang ditentukan oleh atribut XmlSchemaProviderAttribute. Metode tidak mengembalikan properti null dan IsAny pada atribut dibiarkan tetap pada nilai default false. Ini adalah penggunaan jenis IXmlSerializable yang paling umum.

  • Jenis elemen digunakan ketika jenis IXmlSerializable harus mengontrol nama elemen akarnya sendiri. Untuk menandai jenis sebagai jenis elemen, atur properti IsAny pada atribut XmlSchemaProviderAttribute ke true atau mengembalikan null dari metode penyedia skema. Memiliki metode penyedia skema bersifat opsional untuk jenis elemen - Anda dapat menentukan null alih-alih nama metode di XmlSchemaProviderAttribute. Namun, jika IsAny adalah true dan metode penyedia skema sudah ditentukan, metode harus mengembalikan null.

  • Jenis DataSet lama adalah jenis IXmlSerializable yang tidak ditandai dengan atribut XmlSchemaProviderAttribute. Sebaliknya, mereka mengandalkan metode GetSchema untuk pembuatan skema. Pola ini digunakan untuk jenis DataSet dan himpunan data berjenisnya menghasilkan kelas dalam versi .NET Framework sebelumnya, tetapi sekarang sudah usang dan didukung hanya karena alasan lama. Jangan mengandalkan pola ini dan selalu terapkan XmlSchemaProviderAttribute ke jenis IXmlSerializable Anda.

Jenis Konten IXmlserializable

Saat menserialisasikan anggota data dari jenis yang mengimplementasikan IXmlSerializable dan merupakan jenis konten seperti yang ditentukan sebelumnya, serializer menulis elemen pembungkus untuk anggota data dan meneruskan kontrol ke metode WriteXml. Implementasi WriteXml dapat menulis XML apa pun, yang mencakup penambahan atribut ke elemen pembungkus. Setelah WriteXml selesai, serializer menutup elemen.

Saat mendeserialisasi anggota data dari jenis yang mengimplementasikan IXmlSerializable dan merupakan jenis konten seperti yang ditentukan sebelumnya, deserializer memposisikan pembaca XML pada elemen pembungkus untuk anggota data dan meneruskan kontrol ke metode ReadXml. Metode harus membaca seluruh elemen, termasuk tag awal dan akhir. Pastikan kode ReadXml Anda menangani kasus di mana elemen kosong. Selain itu, implementasi ReadXml Anda tidak boleh mengandalkan elemen penyelubung yang dinamai dengan cara khusus. Nama yang dipilih oleh serializer dapat bervariasi.

Diizinkan untuk menetapkan jenis konten IXmlSerializable secara polimorfik, misalnya, ke anggota data jenis Object. Juga diizinkan bagi instans jenis untuk menjadi null. Terakhir, dimungkinkan untuk menggunakan jenis IXmlSerializable dengan preservasi grafik objek yang aktif dan dengan NetDataContractSerializer. Semua fitur ini mengharuskan serializer WCF untuk melampirkan atribut tertentu ke dalam elemen pembungkus ("nil" dan "type" di namespace Instans Skema XML dan "Id", "Ref", "Type" dan "Assembly" di namespace khusus WCF).

Atribut yang akan Diabaikan saat Menerapkan ReadXml

Sebelum meneruskan kontrol ke kode ReadXml Anda, deserializer memeriksa elemen XML, mendeteksi atribut XML khusus ini, dan bertindak atasnya. Misalnya, jika "nil" adalah true, nilai null dideserialisasi dan ReadXml tidak dipanggil. Jika polimorfisme terdeteksi, isi elemen akan dideserialisasi seolah-olah itu adalah jenis yang berbeda. Implementasi jenis ReadXml yang ditetapkan secara polimorfik dipanggil. Bagaimanapun, implementasi ReadXml harus mengabaikan atribut khusus ini karena ditangani oleh deserializer.

Pertimbangan Skema untuk Jenis Konten IXmlSerializable

Saat mengekspor skema dan jenis konten IXmlSerializable, metode penyedia skema akan dipanggil. XmlSchemaSet diteruskan ke metode penyedia skema. Metode ini dapat menambahkan skema apa pun yang valid ke set skema. Set skema berisi skema yang sudah diketahui pada saat ekspor skema terjadi. Ketika metode penyedia skema harus menambahkan item ke set skema, metode tersebut harus menentukan apakah XmlSchema dengan namespace yang sesuai sudah ada dalam set. Jika ya, metode penyedia skema harus menambahkan item baru ke XmlSchema yang sudah ada. Jika tidak, instans XmlSchema baru harus dibuat. Ini penting jika array jenis IXmlSerializable sedang digunakan. Misalnya, jika Anda memiliki jenis IXmlSerializable yang diekspor sebagai jenis "A" di namespace "B", ada kemungkinan bahwa pada saat metode penyedia skema dipanggil, set skema sudah berisi skema untuk "B" untuk menampung jenis "ArrayOfA".

Selain menambahkan jenis ke XmlSchemaSet, metode penyedia skema untuk jenis konten harus mengembalikan nilai non-null. Ini dapat mengembalikan XmlQualifiedName yang menentukan nama jenis skema yang akan digunakan untuk jenis IXmlSerializable yang diberikan. Nama yang memenuhi syarat ini juga berfungsi sebagai nama kontrak data dan namespace untuk jenis tersebut. Diizinkan untuk mengembalikan jenis yang tidak ada dalam set skema segera saat metode penyedia skema kembali. Namun, diperkirakan bahwa pada saat semua jenis terkait diekspor (metode Export dipanggil untuk semua jenis yang relevan pada XsdDataContractExporter dan properti Schemas diakses), jenisnya ada dalam set skema. Mengakses properti Schemas sebelum semua panggilan Export yang relevan dilakukan dapat menghasilkan XmlSchemaException. Untuk informasi selengkapnya proses ekspor, lihat Mengekspor Skema dari Kelas.

Metode penyedia skema juga dapat mengembalikan XmlSchemaType untuk digunakan. Jenis ini mungkin anonim atau mungkin juga tidak. Jika bersifat anonim, skema untuk jenis IXmlSerializable tersebut diekspor sebagai jenis anonim setiap kali jenis IXmlSerializable digunakan sebagai anggota data. Jenis IXmlSerializable masih memiliki namespace dan nama kontrak data. (Ini ditentukan seperti yang dijelaskan dalam Nama Kontrak Data kecuali bahwa atribut DataContractAttribute tidak dapat digunakan untuk mengkustomisasi nama). Jika tidak anonim, itu harus termasuk dari salah satu jenis dalam XmlSchemaSet. Kasus ini setara dengan mengembalikan jenis XmlQualifiedName.

Selain itu, deklarasi elemen global diekspor untuk jenis tersebut. Jika jenis tidak memiliki atribut XmlRootAttribute yang diterapkan padanya, elemen memiliki nama dan namespace yang sama dengan kontrak data, dan properti "nillable"-nya adalah true. Satu-satunya pengecualian untuk ini adalah namespace layanan skema (http://www.w3.org/2001/XMLSchema); jika kontrak data jenis berada di namespace layanan ini, elemen global yang sesuai berada di namespace kosong karena dilarang menambahkan elemen baru ke namespace layanan skema. Jika jenis memiliki XmlRootAttribute atribut yang diterapkan padanya, deklarasi elemen global diekspor menggunakan properti berikut: ElementName, Namespace, dan IsNullable. Default dengan XmlRootAttribute diterapkan adalah nama kontrak data, namespace kosong, dan "nillable" menjadi true.

Aturan deklarasi elemen global yang sama berlaku untuk jenis himpunan data lama. Perhatikan bahwa XmlRootAttribute tidak dapat mengambil alih deklarasi elemen global yang ditambahkan melalui kode kustom, baik itu ditambahkan ke XmlSchemaSet menggunakan metode penyedia skema atau melalui GetSchema untuk jenis himpunan data lama.

Jenis Elemen IXmlSerializable

Jenis elemen IXmlSerializable dapat memiliki properti IsAny yang diatur ke true atau memiliki metode penyedia skema yang mengembalikan null.

Melakukan serialisasi dan deserialisasi jenis elemen sangat mirip dengan serialisasi dan deserialisasi pada jenis konten. Namun, ada beberapa perbedaan penting:

  • Implementasi WriteXml diperkirakan untuk menulis tepat satu elemen (yang tentu saja dapat berisi beberapa elemen turunan). Tidak boleh menulis atribut di luar elemen tunggal ini, elemen saudara ganda atau konten campuran. Elemen bisa saja kosong.

  • Implementasi ReadXml tidak boleh membaca elemen penyelubung. Diperkirakan untuk membaca satu elemen yang dihasilkan WriteXml.

  • Saat melakukan serialisasi jenis elemen secara teratur (misalnya, sebagai anggota data dalam kontrak data), serializer menghasilkan elemen pembungkus sebelum memanggil WriteXml, seperti halnya jenis konten. Namun, saat menserialisasikan jenis elemen di tingkat atas, serializer biasanya tidak menghasilkan elemen pembungkus sama sekali di sekitar elemen yang ditulis WriteXml, kecuali nama akar dan namespace ditentukan secara eksplisit saat membangun serializer di konstruktor DataContractSerializer atau NetDataContractSerializer. Untuk informasi selengkapnya, lihat Serialisasi dan Deserialisasi.

  • Saat menserialisasikan jenis elemen di tingkat atas tanpa menentukan nama akar dan namespace pada waktu konstruksi, WriteStartObject dan WriteEndObject pada dasarnya tidak melakukan apa pun dan WriteObjectContent memanggil WriteXml. Dalam mode ini, objek yang sedang diserialisasikan tidak boleh null dan tidak dapat ditetapkan secara polimorfik. Selain itu, preservasi grafik objek tidak dapat diaktifkan dan NetDataContractSerializer tidak dapat digunakan.

  • Saat mendeserialisasi jenis elemen di tingkat atas tanpa menentukan nama akar dan namespace layanan pada waktu konstruksi, IsStartObject mengembalikan true jika dapat menemukan awal dari elemen apa pun. ReadObject dengan parameter verifyObjectName yang diatur ke true berperilaku dengan cara yang sama seperti IsStartObject sebelum benar-benar membaca objek. ReadObject kemudian meneruskan kontrol ke metode ReadXml.

Skema yang diekspor untuk jenis elemen sama dengan untuk jenis XmlElement seperti yang dijelaskan di bagian sebelumnya, kecuali bahwa metode penyedia skema dapat menambahkan skema tambahan apa pun ke XmlSchemaSet seperti halnya jenis konten. Menggunakan atribut XmlRootAttribute dengan jenis elemen tidak diizinkan, dan deklarasi elemen global tidak pernah dikeluarkan untuk jenis ini.

Perbedaan dari XmlSerializer

Antarmuka IXmlSerializable dan atribut XmlSchemaProviderAttribute dan XmlRootAttribute juga dipahami oleh XmlSerializer. Namun, ada beberapa perbedaan dalam cara perlakuannya di model kontrak data. Perbedaan penting dirangkum dalam daftar berikut:

  • Metode penyedia skema harus bersifat publik untuk digunakan dalam XmlSerializer, tetapi tidak harus bersifat publik untuk digunakan dalam model kontrak data.

  • Metode penyedia skema dipanggil ketika IsAny adalah benar dalam model kontrak data tetapi tidak dengan XmlSerializer.

  • Ketika atribut XmlRootAttribute tidak ada untuk konten atau jenis himpunan data lama, XmlSerializer mengekspor deklarasi elemen global dalam namespace layanan kosong. Dalam model kontrak data, namespace layanan yang digunakan biasanya adalah namespace layanan kontrak data seperti yang dijelaskan sebelumnya.

Waspadai perbedaan-perbedaan ini saat membuat jenis yang digunakan dengan kedua teknologi serialisasi.

Mengimpor Skema IXmlSerializable

Saat mengimpor skema yang dihasilkan dari jenis IXmlSerializable, ada beberapa kemungkinan:

  • Skema yang dihasilkan mungkin adalah skema kontrak data yang valid seperti yang dijelaskan dalam Referensi Skema Kontrak Data. Dalam hal ini, skema dapat diimpor seperti biasa dan jenis kontrak data reguler akan dihasilkan.

  • Skema yang dihasilkan mungkin bukan skema kontrak data yang valid. Misalnya, metode penyedia skema Anda dapat menghasilkan skema yang melibatkan atribut XML yang tidak didukung dalam model kontrak data. Dalam hal ini, Anda dapat mengimpor skema sebagai jenis IXmlSerializable. Mode impor ini tidak aktif secara default tetapi dapat dengan mudah diaktifkan - misalnya, dengan parameter baris perintah /importXmlTypes ke Alat Utilitas Metadata ServiceModel (Svcutil.exe). Ini dijelaskan secara rinci dalam Mengimpor Skema untuk Menghasilkan Kelas. Perhatikan bahwa Anda harus bekerja secara langsung dengan XML untuk instans jenis Anda. Anda juga dapat mempertimbangkan untuk menggunakan teknologi serialisasi yang berbeda yang mendukung berbagai skema – lihat topik tentang penggunaan XmlSerializer.

  • Anda mungkin ingin menggunakan kembali jenis IXmlSerializable yang ada di proksi alih-alih menghasilkan yang baru. Dalam hal ini, fitur jenis yang direferensikan yang dijelaskan dalam topik Mengimpor Skema untuk Menghasilkan Jenis dapat digunakan untuk menunjukkan jenis yang akan digunakan kembali. Ini sesuai dengan penggunaan parameter /reference di svcutil.exe, yang menentukan rakitan yang berisi jenis yang akan digunakan kembali.

Mewakili XML Arbitrer dalam Kontrak Data

XmlElement, array dari jenis XmlNode dan IXmlSerializable memungkinkan Anda untuk menyuntikkan XML arbitrer ke dalam model kontrak data. DataContractSerializer dan NetDataContractSerializer meneruskan konten XML ini ke penulis XML yang digunakan, tanpa mengganggu prosesnya. Namun, penulis XML dapat memberlakukan batasan tertentu pada XML yang mereka tulis. Secara khusus, berikut adalah beberapa contoh penting:

  • Penulis XML biasanya tidak mengizinkan deklarasi dokumen XML (misalnya, <?xml version='1.0' ?>) di tengah penulisan dokumen lain. Anda tidak dapat mengambil dokumen XML lengkap dan menserialisasikannya sebagai Array dari anggota data XmlNode. Untuk melakukan ini, Anda harus menghapus deklarasi dokumen atau menggunakan skema pengodean Anda sendiri untuk mewakilinya.

  • Semua penulis XML yang disediakan dengan instruksi pemrosesan XML penolakan WCF (<? ... ?>) dan definisi jenis dokumen (<! ... >), karena tidak diizinkan dalam pesan SOAP. Sekali lagi, Anda dapat menggunakan mekanisme pengodean Anda sendiri untuk mengatasi pembatasan ini. Jika Anda harus menyertakannya dalam XML yang dihasilkan, Anda dapat menulis encoder kustom yang menggunakan penulis XML yang mendukungnya.

  • Saat menerapkan WriteXml, hindari memanggil metode WriteRaw pada penulis XML. WCF menggunakan berbagai pengodean XML (termasuk biner), sangat sulit atau tidak mungkin untuk menggunakan WriteRaw sehingga hasilnya dapat digunakan dalam pengodean apa pun.

  • Saat menerapkan WriteXml, hindari menggunakan metode WriteEntityRef dan WriteNmToken yang tidak didukung pada penulis XML yang disediakan dengan WCF.

Menggunakan Himpunan Data, Himpunan Data Berjenis, dan DataTable

Menggunakan jenis ini didukung penuh dalam model kontrak data. Saat menggunakan jenis ini, pertimbangkan poin-poin berikut:

  • Skema untuk jenis ini (terutama DataSet dan kelas turunannya yang berjenis) mungkin tidak dapat dioperasikan dengan beberapa platform non-WCF, atau dapat mengakibatkan kegunaan yang buruk ketika digunakan dengan platform ini. Selain itu, menggunakan jenis DataSet mungkin memiliki implikasi performa. Akhirnya, mungkin akan lebih sulit bagi Anda untuk membuat versi aplikasi Anda di masa mendatang. Pertimbangkan untuk menggunakan jenis kontrak data yang ditentukan secara eksplisit alih-alih jenis DataSet dalam kontrak Anda.

  • Saat mengimpor skema DataSet atau DataTable, penting untuk mereferensikan jenis ini. Dengan alat baris perintah Svcutil.exe, ini dapat dicapai dengan meneruskan nama assembly System.Data.dll ke tombol /reference. Jika mengimpor skema himpunan data yang diketik, Anda harus mereferensikan jenis himpunan data yang diketik. Dengan Svcutil.exe, teruskan lokasi perakitan himpunan data yang diketik ke tombol /reference. Untuk informasi selengkapnya tentang jenis referensi, lihat Mengimpor Skema untuk Menghasilkan Kelas.

Dukungan untuk DataSets berjenis dalam model kontrak data terbatas. DataSets berjenis dapat diserialisasikan dan dideserialisasi serta dapat mengekspor skemanya. Namun, impor skema Kontrak Data tidak dapat menghasilkan jenis DataSet berjenis baru dari skema, karena hanya dapat menggunakan kembali yang ada. Anda dapat menunjuk ke DataSet berjenis dengan menggunakan tombol /r Svcutil.exe. Jika Anda mencoba menggunakan Svcutil.exe tanpa tombol /r pada layanan yang menggunakan himpunan data yang diketik, serializer alternatif (XmlSerializer) dipilih secara otomatis. Jika Anda harus menggunakan DataContractSerializer dan harus menghasilkan DataSets dari skema, Anda dapat menggunakan prosedur berikut: menghasilkan jenis DataSet yang diketik (dengan menggunakan alat Xsd.exe dengan tombol /d pada layanan), mengkompilasi jenis, lalu mengarahkannya menggunakan tombol /r pada Svcutil.exe.

Lihat juga