Bagikan melalui


Serialisasi XML

Serialisasi adalah proses mengonversi objek menjadi bentuk yang dapat diangkut dengan mudah. Misalnya, Anda dapat membuat serialisasi objek dan memindahkannya melalui Internet menggunakan HTTP antara klien dan server. Di sisi lain, deserialisasi merekonstruksi objek dari aliran.

Serialisasi XML hanya menserialisasikan bidang publik dan nilai properti 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.

Nota

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

Kelas pusat dalam serialisasi XML adalah XmlSerializer kelas , dan metode terpenting di kelas ini adalah metode Serialize dan Deserialize . XmlSerializer membuat file C# dan mengompilasinya menjadi 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 World Wide Web Consortium (W3C) XML Schema definition language (XSD) 1.0. 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, diannotasi 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 ditera ke skema dan diberi anotasi dengan atribut. Ketika instans kelas tersebut diserialisasikan, XML yang dihasilkan mematuhi Skema XML. Disediakan dengan kelas seperti itu, Anda dapat memprogram model objek yang mudah dimanipulasi sambil yakin 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 saat 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 selanjutnya dapat membuat serialisasi objek 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: Membuat Serialisasi 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" dan "Atribut yang Mengontrol Serialisasi SOAP yang Dikodekan" karena layanan Web XML dapat menggunakan gaya SOAP literal atau 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, ketahui item berikut dan implikasinya:

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

    Nota

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

    Kode dan DLL rentan terhadap proses berbahaya pada saat pembuatan dan kompilasi. Mungkin bagi dua atau beberapa pengguna untuk berbagi direktori TEMP. Berbagi direktori TEMP berbahaya jika kedua akun memiliki hak istimewa 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 bahwa 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 kehabisan sumber daya.

    Serangan semacam ini dihilangkan jika Anda menggunakan komputer yang menjalankan Internet Information Services (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 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 menyajikan ancaman. Ini dapat menjalankan kode berbahaya atau dapat menyuntikkan kode berbahaya ke dalam file C# yang dibuat oleh XmlSerializer. Dalam kasus kedua, ada kemungkinan teoritis bahwa objek berbahaya dapat 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 untuk tidak pernah menserialisasikan data dengan jenis yang tidak diketahui dan tidak tepercaya.

  • Data sensitif berseri mungkin rentan.

    Setelah XmlSerializer memiliki data berseri, xml dapat disimpan sebagai file XML atau penyimpanan data lainnya. Jika penyimpanan data Anda tersedia untuk proses lain, atau terlihat di intranet atau Internet, data dapat dicuri dan digunakan dengan berbahaya. Misalnya, jika Anda membuat aplikasi yang membuat serialisasi pesanan yang menyertakan nomor kartu kredit, datanya 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 diserialkan, mungkin menyerupai yang berikut ini.

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

    Nota

    Hanya koleksi yang diserialkan, bukan properti publik.

  • Objek XmlElement .

  • Objek XmlNode .

  • Objek Himpunan Data .

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 membuat serial 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:

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

  • Tentukan namespace XML yang akan digunakan.

  • Tentukan nama elemen atau atribut jika nama bidang atau properti tidak pantas.

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 menggambarkan buku. Ini fitur judul, penulis, penerbit, dan elemen nomor ISBN. Anda dapat mengembangkan aplikasi yang memproses data XML dengan cara apa pun yang Anda inginkan, misalnya, sebagai pesanan buku, atau sebagai inventori buku. Dalam kedua kasus, satu-satunya persyaratan adalah bahwa aliran XML 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 rakitan 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 DataContractSerializer kelas daripada serialisasi XML.

  • Kelas harus memiliki konstruktor tanpa parameter untuk 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 metode Penambahan harus konsisten (polimorfik) dengan tipe yang dihasilkan dari properti IEnumerator.Current yang diperoleh dari metode GetEnumerator.

    Kelas yang mengimplementasikan ICollection selain IEnumerable (seperti CollectionBase) harus memiliki properti terindeks Item publik (pengindeks di C#) yang menerima bilangan bulat dan harus memiliki properti Count publik dari tipe bilangan bulat. Parameter yang diteruskan ke metode Tambahkan harus sama dengan yang dikembalikan dari properti Item , atau salah satu basis 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 Tipe Data XSD

Dokumen W3C berjudul Skema XML Bagian 2: Jenis data menentukan jenis data sederhana yang diizinkan dalam skema bahasa definisi Skema XML (XSD). Untuk banyak dari ini (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, 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