Serialisasi XML

Serialisasi adalah proses mengubah objek menjadi format yang dapat dengan mudah dipindahkan. Misalnya, Anda dapat menserialisasikan objek dan memindahkannya melalui Internet menggunakan HTTP antara klien dan server. Di sisi lain, deserialisasi merekonstruksi objek dari aliran.

Serialisasi XML menserialisasikan hanya bidang publik dan nilai properti dari suatu objek ke dalam aliran XML. Serialisasi XML tidak menyertakan informasi jenis. Misalnya, jika Anda memiliki objek Buku yang ada di namespace Pustaka, tidak ada jaminan bahwa objek tersebut dideserialisasi ke dalam objek dengan jenis yang sama.

Catatan

Serialisasi XML tidak mengonversi metode, pengindeks, bidang privat, atau properti baca-saja (kecuali koleksi baca-saja). Untuk membuat serialisasi semua bidang dan properti objek, baik publik maupun privat, gunakan DataContractSerializer alih-alih serialisasi XML.

Kelas pusat dalam serialisasi XML adalah kelas XmlSerializer, dan metode terpenting dalam kelas ini adalah metode Serialisasi dan Deserialisasi. XmlSerializer memuat file C# dan mengkompilasinya ke dalam file .dll untuk melakukan serialisasi ini. Alat Generator Serializer XML (Sgen.exe) dirancang untuk menghasilkan rakitan serialisasi ini terlebih dahulu untuk disebarkan dengan aplikasi Anda dan meningkatkan performa startup. Aliran XML yang dihasilkan oleh XmlSerializer mematuhi rekomendasi bahasa definisi Skema XML (XSD) 1.0 World Wide Web Consortium (W3C). Selain itu, jenis data yang dihasilkan sesuai dengan dokumen berjudul "Skema XML Bagian 2: Jenis data."

Data dalam objek Anda dijelaskan menggunakan konstruksi bahasa pemrograman seperti kelas, bidang, properti, jenis primitif, array, dan bahkan XML yang disematkan dalam bentuk objek XmlElement atau XmlAttribute. Anda memiliki opsi untuk membuat kelas Anda sendiri, dianotasikan dengan atribut, atau menggunakan alat Definisi Skema XML untuk menghasilkan kelas berdasarkan Skema XML yang ada.

Jika Anda memiliki Skema XML, Anda dapat menjalankan alat Definisi Skema XML untuk menghasilkan sekumpulan kelas yang diketik dengan kuat ke skema dan dianotasikan dengan atribut. Ketika instans kelas semacam ini diserialisasikan, XML yang dihasilkan mematuhi Skema XML. Disediakan dengan kelas semacam ini, Anda dapat memprogram terhadap model objek yang mudah dimanipulasi sambil diyakinkan bahwa XML yang dihasilkan sesuai dengan skema XML. Ini adalah alternatif untuk menggunakan kelas lain di .NET, seperti kelas XmlReader dan XmlWriter , untuk mengurai dan menulis aliran XML. Untuk informasi selengkapnya, lihat Dokumen dan Data XML. Kelas-kelas ini memungkinkan Anda mengurai aliran XML apa pun. Sebaliknya, gunakan XmlSerializer bila aliran XML diharapkan sesuai dengan Skema XML yang diketahui.

Atribut mengontrol aliran XML yang dihasilkan oleh kelas XmlSerializer, memungkinkan Anda mengatur namespace XML, nama elemen, nama atribut, dan sebagainya, dari aliran XML. Untuk informasi selengkapnya tentang atribut ini dan cara mereka mengontrol serialisasi XML, lihat Mengontrol Serialisasi XML Menggunakan Atribut. Untuk tabel atribut yang digunakan untuk mengontrol XML yang dihasilkan, lihat Atribut yang Mengontrol Serialisasi XML.

Kelas XmlSerializer dapat menserialisasikan objek lebih lanjut dan menghasilkan aliran XML SOAP yang dikodekan. XML yang dihasilkan mematuhi bagian 5 dari dokumen World Wide Web Consortium berjudul "Simple Object Access Protocol (SOAP) 1.1." Untuk informasi selengkapnya tentang proses ini, lihat Cara: Menserialisasikan Objek sebagai Aliran XML SOAP-Encoded. Untuk tabel atribut yang mengontrol XML yang dihasilkan, lihat Atribut yang Mengontrol Serialisasi SOAP yang Dikodekan.

Kelas XmlSerializer menghasilkan pesan SOAP yang dibuat oleh, dan diteruskan ke, layanan Web XML. Untuk mengontrol pesan SOAP, Anda dapat menerapkan atribut ke kelas, mengembalikan nilai, parameter, dan bidang yang ditemukan dalam file layanan Web XML (.asmx). Anda dapat menggunakan atribut yang tercantum dalam "Atribut yang Mengontrol Serialisasi XML" maupun "Atribut yang Mengontrol Serialisasi SOAP yang Dikodekan" karena layanan Web XML dapat menggunakan gaya SOAP harfiah atau yang dikodekan. Untuk informasi selengkapnya tentang menggunakan atribut untuk mengontrol XML yang dihasilkan oleh layanan Web XML, lihat Serialisasi XML dengan Layanan Web XML. Untuk informasi selengkapnya tentang layanan WEB SOAP dan XML, lihat Menyesuaikan Pemformatan Pesan SOAP.

Pertimbangan Keamanan untuk Aplikasi XmlSerializer

Saat membuat aplikasi yang menggunakan XmlSerializer, cermati item berikut dan implikasinya:

  • XmlSerializer membuat file C# (.cs) dan mengkompilasinya ke dalam file .dll dalam direktori yang dinamai oleh variabel lingkungan TEMP; serialisasi terjadi dengan DLL tersebut.

    Catatan

    Rakitan serialisasi ini dapat dihasilkan terlebih dahulu dan ditandatangani dengan menggunakan alat SGen.exe. Alat ini tidak berfungsi pada server layanan Web. Dengan kata lain, alat ini hanya untuk penggunaan klien dan untuk serialisasi manual.

    Kode dan DLL rentan terhadap proses berbahaya pada saat pembuatan dan kompilasi. Dua pengguna atau lebih mungkin bisa berbagi direktori TEMP. Berbagi direktori TEMP berbahaya jika kedua akun memiliki hak keamanan yang berbeda dan akun hak istimewa yang lebih tinggi menjalankan aplikasi menggunakan XmlSerializer. Dalam hal ini, satu pengguna dapat melanggar keamanan komputer dengan mengganti file .cs atau .dll yang dikompilasi. Untuk menghilangkan kekhawatiran ini, selalu pastikan setiap akun di komputer memiliki profilnya sendiri. Secara default, variabel lingkungan TEMP menunjuk ke direktori yang berbeda untuk setiap akun.

  • Jika pengguna berbahaya mengirim aliran data XML berkelanjutan ke server Web (penolakan serangan layanan), maka XmlSerializer terus memproses data hingga komputer kekurangan sumber daya.

    Serangan semacam ini dihilangkan jika Anda menggunakan komputer yang menjalankan Layanan Informasi Internet (IIS), dan aplikasi Anda berjalan dalam IIS. IIS memiliki gerbang yang tidak memproses aliran lebih lama dari jumlah yang ditetapkan (defaultnya adalah 4 KB). Jika Anda membuat aplikasi yang tidak menggunakan IIS dan melakukan deserialisasi dengan XmlSerializer, Anda harus menerapkan gerbang serupa yang mencegah penolakan serangan layanan.

  • XmlSerializer menserialisasikan data dan menjalankan kode apa pun menggunakan jenis apa pun yang diberikan padanya.

    Ada dua cara di mana objek berbahaya bisa menimbulkan ancaman. Objek itu dapat menjalankan kode berbahaya atau dapat menyuntikkan kode berbahaya ke dalam file C# yang dibuat oleh XmlSerializer. Dalam kasus kedua, ada kemungkinan secara teori bahwa objek berbahaya mungkin menyuntikkan kode ke dalam file C# yang dibuat oleh XmlSerializer. Meskipun masalah ini telah diperiksa secara menyeluruh, dan serangan seperti itu dianggap tidak mungkin, Anda harus mengambil tindakan pencegahan agar jangan pernah menserialisasikan data dengan jenis yang tidak diketahui dan tidak tepercaya.

  • Data sensitif serialisasi mungkin rentan.

    Setelah XmlSerializer telah menserialisasi data, data tersebut dapat disimpan sebagai file XML atau simpanan data lainnya. Jika penyimpanan data Anda tersedia untuk proses lain, atau terlihat di intranet atau Internet, data dapat dicuri dan digunakan secara membahayakan. Misalnya, jika Anda membuat aplikasi yang membuat serialisasi pesanan yang menyertakan nomor kartu kredit, data tersebut sangat sensitif. Untuk membantu mencegah hal ini, selalu lindungi penyimpanan untuk data Anda dan ambil langkah-langkah untuk menjaganya tetap privat.

Serialisasi Kelas Sederhana

Contoh kode berikut menunjukkan kelas dasar dengan bidang publik.

Public Class OrderForm
    Public OrderDate As DateTime
End Class
public class OrderForm
{
    public DateTime OrderDate;
}

Ketika instans kelas ini diserialisasikan, instans itu mungkin akan menyerupai yang berikut.

<OrderForm>
    <OrderDate>12/12/01</OrderDate>
</OrderForm>

Untuk contoh serialisasi lainnya, lihat Contoh Serialisasi XML.

Item Yang Dapat Diserialisasikan

Item berikut dapat diserialisasikan menggunakan kelas XmlSerializer :

  • Properti baca/tulis publik dan bidang kelas publik.

  • Kelas yang mengimplementasikan ICollection atau IEnumerable.

    Catatan

    Hanya koleksi yang diserialisasikan, bukan properti publik.

  • Objek XmlElement.

  • Objek XmlNode.

  • Objek DataSet.

Untuk informasi selengkapnya tentang menserialisasikan atau mendeserialisasi objek, lihat Cara: Membuat Serialisasi Objek dan Cara: Mendeserialisasi Objek.

Keuntungan Menggunakan Serialisasi XML

Kelas XmlSerializer memberi Anda kontrol yang lengkap dan fleksibel saat Anda melakukan serialisasi objek sebagai XML. Jika Anda membuat layanan Web XML, Anda dapat menerapkan atribut yang mengontrol serialisasi ke kelas dan anggota untuk memastikan bahwa output XML sesuai dengan skema tertentu.

Misalnya, XmlSerializer memungkinkan Anda untuk:

  • Menentukan apakah bidang atau properti harus dikodekan sebagai atribut atau elemen.

  • Menentukan namespace XML yang akan digunakan.

  • Menentukan nama elemen atau atribut jika nama bidang atau properti tidak sesuai.

Keuntungan lain dari serialisasi XML adalah Anda tidak memiliki batasan pada aplikasi yang Anda kembangkan, selama aliran XML yang dihasilkan sesuai dengan skema tertentu. Bayangkan skema yang digunakan untuk mendeskripsikan buku. Skema tersebut menampilkan elemen judul, penulis, penerbit, dan nomor ISBN. Anda dapat mengembangkan aplikasi yang memproses data XML dengan cara apa pun yang Anda inginkan, misalnya, sebagai pesanan buku, atau sebagai inventaris buku. Dalam kedua kasus, satu-satunya persyaratan adalah aliran XML yang sesuai dengan skema bahasa definisi Skema XML (XSD) yang ditentukan.

Pertimbangan Serialisasi XML

Berikut ini harus dipertimbangkan saat menggunakan kelas XmlSerializer :

  • Alat Sgen.exe dirancang secara tegas untuk menghasilkan rakitan serialisasi untuk performa optimal.

  • Data berseri hanya berisi data itu sendiri dan struktur kelas Anda. Identitas jenis dan informasi perakitan tidak disertakan.

  • Hanya properti dan bidang publik yang dapat diserialisasikan. Properti harus memiliki aksesor publik (dapatkan dan atur metode). Jika Anda harus menserialisasikan data non-publik, gunakan kelas DataContractSerializer, bukannya serialisasi XML.

  • Kelas harus memiliki konstruktor tanpa parameter agar bisa diserialisasikan oleh XmlSerializer.

  • Metode tidak dapat diserialisasikan.

  • XmlSerializer dapat memproses kelas yang mengimplementasikan IEnumerable atau ICollection secara berbeda jika memenuhi persyaratan tertentu, sebagai berikut.

    Kelas yang mengimplementasikan IEnumerable harus menerapkan metode Tambahkan publik yang mengambil satu parameter. Parameter Tambahkan metode harus konsisten (polimorfik) dengan jenis yang dikembalikan dari properti IEnumerator.Current yang dikembalikan dari metode GetEnumerator.

    Kelas yang mengimplementasikan ICollection selain IEnumerable (seperti CollectionBase) harus memiliki Item publik dengan properti terindeks (pengindeks di C#) yang mengambil bilangan bulat dan harus memiliki properti Hitungan publik dari bilangan bulat jenis. Parameter yang diteruskan ke metode Tambahkan harus berjenis sama dengan yang dikembalikan dari properti Item, atau salah satu dasar dari jenis tersebut.

    Untuk kelas yang mengimplementasikan ICollection, nilai yang akan diserialisasikan diambil dari properti Item terindeks daripada dengan memanggil GetEnumerator. Selain itu, bidang publik dan properti tidak diserialisasikan, dengan pengecualian bidang publik yang mengembalikan kelas koleksi lain (yang mengimplementasikan ICollection). Misalnya, lihat Contoh Serialisasi XML.

Pemetaan Jenis Data XSD

Dokumen W3C berjudul XML Schema Part 2: Datatypes menentukan jenis data sederhana yang diizinkan dalam skema bahasa definisi Skema XML (XSD). Untuk banyak jenis data (misalnya, int dan desimal), ada jenis data yang sesuai di .NET. Namun, beberapa jenis data XML tidak memiliki jenis data .NET yang sesuai, misalnya, jenis data NMTOKEN. Dalam kasus seperti itu, jika Anda menggunakan alat Definisi Skema XML (Alat Definisi Skema XML (Xsd.exe)) untuk menghasilkan kelas dari skema, atribut yang sesuai diterapkan ke anggota string jenis, dan properti DataType-nya diatur ke nama jenis data XML. Misalnya, jika skema berisi elemen bernama "MyToken" dengan jenis data XML NMTOKEN, maka kelas yang dihasilkan mungkin berisi anggota seperti yang ditunjukkan dalam contoh berikut.

<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;

Demikian pula, jika Anda membuat kelas yang harus sesuai dengan Skema XML (XSD) tertentu, Anda harus menerapkan atribut yang sesuai dan mengatur properti DataType-nya ke nama jenis data XML yang diinginkan.

Untuk daftar lengkap pemetaan jenis, lihat properti DataType untuk salah satu kelas atribut berikut:

Lihat juga