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 propertinull
dan IsAny pada atribut dibiarkan tetap pada nilai defaultfalse
. Ini adalah penggunaan jenisIXmlSerializable
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 ketrue
atau mengembalikan null dari metode penyedia skema. Memiliki metode penyedia skema bersifat opsional untuk jenis elemen - Anda dapat menentukan null alih-alih nama metode diXmlSchemaProviderAttribute
. Namun, jikaIsAny
adalahtrue
dan metode penyedia skema sudah ditentukan, metode harus mengembalikan null.Jenis DataSet lama adalah jenis
IXmlSerializable
yang tidak ditandai dengan atributXmlSchemaProviderAttribute
. Sebaliknya, mereka mengandalkan metode GetSchema untuk pembuatan skema. Pola ini digunakan untuk jenisDataSet
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 terapkanXmlSchemaProviderAttribute
ke jenisIXmlSerializable
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 dihasilkanWriteXml
.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 ditulisWriteXml
, kecuali nama akar dan namespace ditentukan secara eksplisit saat membangun serializer di konstruktorDataContractSerializer
atauNetDataContractSerializer
. 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 danNetDataContractSerializer
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 parameterverifyObjectName
yang diatur ketrue
berperilaku dengan cara yang sama sepertiIsStartObject
sebelum benar-benar membaca objek.ReadObject
kemudian meneruskan kontrol ke metodeReadXml
.
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 denganXmlSerializer
.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 penggunaanXmlSerializer
.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 dataXmlNode
. 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 menggunakanWriteRaw
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 jenisDataSet
dalam kontrak Anda.Saat mengimpor skema
DataSet
atauDataTable
, 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.