Bagikan melalui


Serialisasi

Catatan

Konten ini dicetak ulang oleh izin Pearson Education, Inc. dari Panduan Desain Kerangka Kerja: Konvensi, Idiom, dan Pola untuk Pustaka .NET yang Dapat Digunakan Kembali, Edisi ke-2. Edisi itu diterbitkan pada tahun 2008, dan buku tersebut telah sepenuhnya direvisi pada edisi ketiga. Beberapa informasi di halaman ini mungkin sudah kedaluarsa.

Serialisasi adalah proses mengubah objek menjadi format yang dapat dengan mudah dipertahankan atau diangkut. Misalnya, Anda dapat membuat serialisasi objek, memindahkannya melalui internet menggunakan HTTP, dan mendeserialisasikannya di mesin tujuan.

.NET Framework menawarkan tiga teknologi serialisasi utama yang dioptimalkan untuk berbagai skenario serialisasi. Tabel berikut mencantumkan teknologi ini dan jenis kerangka kerja utama yang terkait dengan teknologi ini.

Nama Teknologi Jenis Utama Skenario
Serialisasi Kontrak Data DataContractAttribute
DataMemberAttribute
DataContractSerializer
NetDataContractSerializer
DataContractJsonSerializer
ISerializable
Persistensi umum
Layanan web
JSON
Serialisasi XML XmlSerializer Format XML dengan kontrol penuh atas bentuk XML
Serialisasi Runtime (Biner dan SOAP) SerializableAttribute
ISerializable
BinaryFormatter
SoapFormatter
.NET Remoting

✔️ Pikirkan tentang serialisasi ketika Anda merancang jenis baru.

Memilih Teknologi Serialisasi yang Tepat untuk Mendukung

✔️ PERTIMBANGKAN untuk mendukung Serialisasi Kontrak Data jika instans jenis Anda mungkin perlu dipertahankan atau digunakan di Layanan Web.

✔️ PERTIMBANGKAN untuk mendukung Serialisasi XML alih-alih atau selain Serialisasi Kontrak Data jika Anda memerlukan kontrol lebih besar atas format XML yang dihasilkan saat jenis tersebut diserialkan.

Ini mungkin diperlukan dalam beberapa skenario interoperabilitas ketika Anda perlu menggunakan konstruksi XML yang tidak didukung oleh Serialisasi Kontrak Data, misalnya, untuk menghasilkan atribut XML.

✔️ PERTIMBANGKAN untuk mendukung Serialisasi Runtime jika instans jenis Anda perlu melakukan perjalanan melintasi batas .NET Remoting.

❌ HINDARI mendukung Serialisasi Runtime atau Serialisasi XML hanya karena alasan persistensi umum. Memilih Serialisasi Kontrak Data sebagai gantinya.

Serialisasi Kontrak Data Pendukung

Jenis dapat mendukung Serialisasi Kontrak Data dengan menerapkan DataContractAttribute ke jenis dan DataMemberAttribute ke anggota (bidang dan properti) dari jenis tersebut.

✔️ PERTIMBANGKAN untuk menandai anggota data dari jenis publik Anda jika jenis tersebut dapat digunakan dalam kepercayaan parsial.

Dalam kepercayaan penuh, pembuat serial Kontrak Data dapat membuat serial dan men-deserialkan jenis dan anggota nonpublik, tetapi hanya anggota publik yang dapat diserialkan dan di-deserialkan dalam kepercayaan parsial.

✔️ DO menerapkan getter dan setter pada semua properti yang memiliki DataMemberAttribute. Pembuat Serial Kontrak Data membutuhkan getter dan setter untuk jenis yang akan dianggap dapat diserialkan. (Dalam .NET Framework 3.5 SP1, beberapa properti koleksi bisa berupa get-only.) Jika jenis tidak akan digunakan dalam kepercayaan parsial, salah satu atau kedua pengakses properti dapat bersifat nonpublik.

✔️ PERTIMBANGKAN untuk menggunakan panggilan balik serialisasi untuk inisialisasi instans yang di-deserialkan.

Konstruktor tidak dipanggil saat objek dideserialisasi. (Ada pengecualian untuk aturan. Konstruktor koleksi yang ditandai dengan CollectionDataContractAttribute dipanggil selama deserialisasi.) Oleh karena itu, logika apa pun yang dijalankan selama konstruksi normal perlu diimplementasikan sebagai salah satu panggilan balik serialisasi.

OnDeserializedAttribute adalah atribut panggilan balik yang paling umum digunakan. Atribut lain dalam keluarga adalah OnDeserializingAttribute, OnSerializingAttribute, dan OnSerializedAttribute. Mereka dapat digunakan untuk menandai callback yang dieksekusi sebelum deserialisasi, sebelum serialisasi, dan akhirnya, setelah serialisasi, masing-masing.

✔️ PERTIMBANGKAN menggunakan KnownTypeAttribute untuk menunjukkan jenis konkret yang harus digunakan saat mendeserialisasi grafik objek yang kompleks.

✔️ Pertimbangkan kompatibilitas mundur dan maju saat membuat atau mengubah jenis serializable.

Perlu diingat bahwa aliran serial dari versi mendatang dari jenis Anda dapat di-deserialkan ke dalam versi jenis saat ini, dan sebaliknya.

Pastikan Anda memahami bahwa anggota data, bahkan pribadi dan internal, tidak dapat mengubah nama, jenis, atau bahkan pesanan mereka dalam versi jenis mendatang kecuali perawatan khusus diambil untuk mempertahankan kontrak menggunakan parameter eksplisit ke atribut kontrak data.

Uji kompatibilitas serialisasi saat membuat perubahan pada jenis yang dapat diserialkan. Coba deserializing versi baru menjadi versi lama, dan sebaliknya.

✔️ PERTIMBANGKAN penerapan IExtensibleDataObject untuk memungkinkan round-tripping antara berbagai versi jenis.

Antarmuka memungkinkan pembuat serial untuk memastikan bahwa tidak ada data yang hilang selama putaran-tersandung. Properti IExtensibleDataObject.ExtensionData digunakan untuk menyimpan data apa pun dari versi jenis yang akan datang yang tidak diketahui oleh versi saat ini, sehingga tidak dapat menyimpannya di anggota datanya. Ketika versi saat ini kemudian diserialkan dan di-deserialkan menjadi versi mendatang, data tambahan akan tersedia dalam aliran serial.

Mendukung Serialisasi XML

Serialisasi Kontrak Data adalah teknologi serialisasi utama (default) di .NET Framework, tetapi ada skenario serialisasi yang tidak didukung oleh Serialisasi Kontrak Data. Misalnya, itu tidak memberi Anda kontrol penuh atas bentuk XML yang diproduksi atau digunakan oleh pembuat serial. Jika kontrol yang baik seperti itu diperlukan, Serialisasi XML harus digunakan, dan Anda perlu merancang jenis Anda untuk mendukung teknologi serialisasi ini.

❌ HINDARI merancang jenis Anda khusus untuk Serialisasi XML, kecuali Anda memiliki alasan yang sangat kuat untuk mengontrol bentuk XML yang dihasilkan. Teknologi serialisasi ini telah digantikan oleh Serialisasi Kontrak Data yang dibahas di bagian sebelumnya.

✔️ PERTIMBANGKAN untuk menerapkan IXmlSerializable antarmuka jika Anda menginginkan kontrol yang lebih besar atas bentuk XML yang diserialkan daripada yang ditawarkan dengan menerapkan atribut Serialisasi XML. Dua metode antarmuka, ReadXml dan WriteXml, memungkinkan Anda untuk sepenuhnya mengontrol aliran XML yang diserialkan. Anda juga dapat mengontrol skema XML yang dihasilkan untuk jenis dengan menerapkan XmlSchemaProviderAttribute.

Mendukung Serialisasi Runtime

Runtime Serialization adalah teknologi yang digunakan oleh .NET Remoting. Jika menurut Anda jenis Anda akan diangkut menggunakan .NET Remoting, Anda perlu memastikan mereka mendukung Serialisasi Runtime.

Dukungan dasar untuk Serialisasi Runtime dapat disediakan dengan menerapkan skenario SerializableAttribute, dan yang lebih canggih melibatkan penerapan Pola Serializable Runtime sederhana (menerapkan ISerializable dan menyediakan konstruktor serialisasi).

✔️ PERTIMBANGKAN untuk mendukung Serialisasi Runtime jika jenis Anda akan digunakan dengan .NET Remoting. Misalnya, System.AddIn namespace layanan menggunakan .NET Remoting, sehingga semua jenis yang dipertukarkan antara System.AddIn add-in perlu mendukung Serialisasi Runtime.

✔️ PERTIMBANGKAN untuk menerapkan Pola Serializable Runtime jika Anda ingin kontrol penuh atas proses serialisasi. Misalnya, jika Anda ingin mengubah data saat diserialisasikan atau dideserialisasikan.

Polanya sangat sederhana. Yang perlu Anda lakukan adalah mengimplementasikan ISerializable antarmuka dan menyediakan konstruktor khusus yang digunakan saat objek di-deserialkan.

✔️ DO membuat konstruktor serialisasi dilindungi dan memberikan dua parameter berjenis dan diberi nama persis seperti yang ditunjukkan pada sampel di sini.

[Serializable]
public class Person : ISerializable
{
    protected Person(SerializationInfo info, StreamingContext context)
    {
        // ...
    }
}

✔️ DO menerapkan ISerializable anggota secara eksplisit.

✔️ DO menerapkan permintaan tautan ke ISerializable.GetObjectData implementasi. Ini memastikan bahwa hanya inti yang sepenuhnya tepercaya dan Runtime Serializer yang memiliki akses ke anggota.

Portions © 2005, 2009 Microsoft Corporation. Semua hak dilindungi undang-undang.

Dicetak ulang dengan izin dari Pearson Education, Inc. dari Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition oleh Krzysztof Cwalina dan Brad Abrams, diterbitkan 22 Okt 2008 oleh Addison-Wesley Professional sebagai bagian dari Seri Pengembangan Microsoft Windows.

Lihat juga