Bagikan melalui


Kelas System.Runtime.Serialization.DataContractSerializer

Nota

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Gunakan kelas DataContractSerializer untuk melakukan serialisasi dan deserialisasi instans dari suatu tipe ke dalam aliran atau dokumen XML. Misalnya, Anda dapat membuat jenis bernama Person dengan properti yang berisi data penting, seperti nama dan alamat. Anda kemudian dapat membuat dan memanipulasi instans Person kelas dan menulis semua nilai propertinya dalam dokumen XML untuk pengambilan nanti, atau dalam aliran XML untuk transportasi segera. Yang terpenting, DataContractSerializer digunakan untuk menserialisasikan dan mendeserialisasi data yang dikirim dalam pesan Windows Communication Foundation (WCF). Terapkan atribut DataContractAttribute pada kelas, dan atribut DataMemberAttribute pada anggota kelas untuk menentukan properti dan bidang yang akan diserialisasi.

Untuk daftar jenis yang dapat diserialisasikan, lihat Jenis yang Didukung oleh Serializer Kontrak Data.

Untuk menggunakan DataContractSerializer, pertama buatlah instans kelas dan objek yang sesuai untuk menulis atau membaca format; misalnya, instans dari XmlDictionaryWriter. Kemudian panggil WriteObject metode untuk mempertahankan data. Untuk mengambil data, buat objek yang sesuai untuk membaca format data (seperti XmlDictionaryReader untuk dokumen XML) dan panggil ReadObject metode .

Untuk informasi selengkapnya tentang menggunakan DataContractSerializer, lihat Serialisasi dan Deserialisasi.

Anda dapat mengatur jenis serializer kontrak data menggunakan <elemen dataContractSerializer> dalam file konfigurasi aplikasi klien.

Menyiapkan kelas untuk serialisasi atau deserialisasi

DataContractSerializer digunakan dalam kombinasi dengan kelas DataContractAttribute dan DataMemberAttribute. Untuk menyiapkan kelas untuk serialisasi, terapkan DataContractAttribute ke kelas . Untuk setiap anggota kelas yang mengembalikan data yang ingin Anda serialkan, terapkan DataMemberAttribute. Anda dapat membuat serialisasi bidang dan properti, terlepas dari aksesibilitas: privat, terlindungi, internal, terlindungi internal, atau publik.

Misalnya, skema Anda menentukan Customer dengan ID properti, tetapi Anda sudah memiliki aplikasi yang sudah ada yang menggunakan jenis bernama Person dengan Name properti. Untuk membuat jenis yang sesuai dengan kontrak, pertama-tama terapkan DataContractAttribute ke kelas . Kemudian terapkan DataMemberAttribute pada setiap bidang atau properti yang ingin Anda serialkan.

Nota

Anda dapat menerapkan DataMemberAttribute pada anggota privat dan publik.

Format akhir XML tidak perlu berupa teks. Sebaliknya, DataContractSerializer menuliskan data sebagai himpunan info XML, yang memungkinkan Anda menulis data ke format apa pun yang dikenali oleh XmlReader dan XmlWriter. Disarankan agar Anda menggunakan XmlDictionaryReader kelas dan XmlDictionaryWriter untuk membaca dan menulis, karena keduanya dioptimalkan untuk bekerja dengan DataContractSerializer.

Jika Anda membuat kelas yang memiliki bidang atau properti yang harus diisi sebelum serialisasi atau deserialisasi terjadi, gunakan atribut panggilan balik, seperti yang dijelaskan dalam Version-Tolerant Panggilan Balik Serialisasi.

Tambahkan ke kumpulan jenis yang diketahui

Saat melakukan serialisasi atau deserialisasi objek, diperlukan bahwa tipe tersebut "diketahui" oleh DataContractSerializer. Mulailah dengan membuat instans dari kelas IEnumerable<T> yang mengimplementasikan (seperti List<T>) dan menambahkan jenis yang diketahui ke koleksi. Kemudian buat instance dari DataContractSerializer menggunakan salah satu overload yang menerima IEnumerable<T> (misalnya, DataContractSerializer(Type, IEnumerable<Type>)).

Nota

Tidak seperti jenis primitif lainnya, DateTimeOffset struktur bukan jenis yang diketahui secara default, jadi harus ditambahkan secara manual ke daftar jenis yang diketahui (lihat Jenis Yang Diketahui Kontrak Data).

Kompatibilitas ke depan

DataContractSerializer memahami kontrak data yang telah dirancang agar kompatibel dengan versi kontrak di masa mendatang. Jenis tersebut IExtensibleDataObject mengimplementasikan antarmuka. Antarmuka memiliki properti ExtensionData yang mengembalikan objek ExtensionDataObject. Untuk informasi selengkapnya, lihat Kontrak DataForward-Compatible.

Jalankan di bawah kepercayaan parsial

Saat membuat instans objek target selama deserialisasi, DataContractSerializer tidak memanggil konstruktor objek target. Jika Anda membangun jenis [DataContract] yang dapat diakses dari tingkat kepercayaan parsial (yaitu, publik dan dalam rakitan yang memiliki AllowPartiallyTrustedCallers atribut yang diterapkan) serta melakukan beberapa tindakan yang berkaitan dengan keamanan, Anda harus tahu bahwa konstruktor tidak dipanggil. Secara khusus, teknik berikut tidak berfungsi:

  • Jika Anda mencoba membatasi akses kepercayaan parsial dengan membuat konstruktor internal atau privat, atau dengan menambahkan LinkDemand ke konstruktor -- keduanya tidak memiliki efek selama deserialisasi di bawah kepercayaan parsial.
  • Jika Anda membuat kode kelas yang mengasumsikan konstruktor telah berjalan, kelas mungkin masuk ke status internal yang tidak valid yang dapat dieksploitasi.