Serialisasi

Nota

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 mengonversi 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 Jarak Jauh

Pastikan untuk mempertimbangkan serialisasi saat Anda merancang jenis baru.

Memilih Teknologi Serialisasi yang Tepat untuk Didukung

✔️ 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 diserialisasikan.

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

✔️ Pertimbangkan mendukung Serialisasi Runtime jika instans tipe Anda perlu beroperasi melintasi batas Remoting .NET.

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

Dukungan untuk Serialisasi Kontrak Data

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 jenis Anda yang bersifat publik jika jenisnya dapat digunakan dalam kepercayaan sebagian.

Dalam kepercayaan penuh, serializer Kontrak Data dapat menserialisasi dan mendeserialisasi tipe dan anggota yang bersifat nonpublik, tetapi dalam kepercayaan terbatas, hanya anggota publik yang dapat diserialisasi dan dideserialisasi.

✔️ DO terapkan getter dan setter pada semua properti yang memiliki DataMemberAttribute. Serializer Kontrak Data mengharuskan baik getter maupun setter agar jenis tersebut dianggap dapat diserialkan. (Dalam .NET Framework 3.5 SP1, beberapa properti koleksi bisa bersifat get-only.) Jika tipe tidak akan digunakan dalam lingkungan dengan kepercayaan parsial, salah satu atau kedua aksesor properti dapat menjadi nonpublik.

✔️ PERTIMBANGKAN untuk menggunakan panggilan balik serialisasi untuk inisialisasi instans yang dideserialisasi.

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, , OnSerializingAttributedan OnSerializedAttribute. Mereka dapat digunakan untuk menandai panggilan balik yang dieksekusi sebelum deserialisasi, sebelum serialisasi, dan akhirnya, setelah serialisasi, masing-masing.

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

✔️ DO perhatikan kompatibilitas mundur dan maju saat membuat atau mengubah tipe yang bisa diserialisasi.

Ingatlah bahwa data berseri dari versi tipe Anda di masa depan dapat dideserialisasi ke dalam versi tipe saat ini, dan sebaliknya.

Pastikan Anda memahami bahwa anggota data, bahkan yang bersifat privat dan internal, tidak dapat mengubah nama, jenis, atau bahkan urutan mereka dalam versi mendatang dari tipe tersebut, kecuali jika tindakan khusus diambil untuk mempertahankan kontrak menggunakan parameter eksplisit dari atribut kontrak data.

Uji kompatibilitas serialisasi saat membuat perubahan pada jenis yang dapat diserialisasikan. Coba deserialisasi ulang versi baru ke versi lama, dan sebaliknya.

✔️ PERTIMBANGKAN untuk menerapkan IExtensibleDataObject agar dapat melakukan pertukaran data antara berbagai versi jenis.

Antarmuka ini memungkinkan serializer untuk memastikan bahwa tidak ada data yang hilang selama proses bolak-balik. Properti IExtensibleDataObject.ExtensionData ini 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 diserialisasikan dan dideserialisasi dalam konteks versi mendatang, data tambahan akan tersedia di alur data berseri.

Mendukung Serialisasi XML

Serialisasi Kontrak Data adalah teknologi serialisasi utama (default) dalam .NET Framework, tetapi ada skenario serialisasi yang tidak didukung oleh Serialisasi Kontrak Data. Misalnya, ini tidak memberi Anda kontrol penuh atas bentuk XML yang dihasilkan atau digunakan oleh serializer. Jika kontrol halus tersebut 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 antarmuka IXmlSerializable jika Anda ingin kontrol lebih atas bentuk XML yang diserialisasikan daripada yang ditawarkan dengan menerapkan atribut serialisasi XML. Dua metode antarmuka, ReadXml dan WriteXml, memungkinkan Anda untuk sepenuhnya mengontrol aliran XML yang diserialisasikan. Anda juga dapat mengontrol skema XML yang dihasilkan untuk jenis dengan menerapkan XmlSchemaProviderAttribute.

Mendukung Serialisasi Runtime

Teknologi Serialisasi Runtime digunakan oleh .NET Remoting. Jika Anda merasa tipe Anda akan ditransportasikan menggunakan .NET Remoting, Anda perlu memastikan bahwa tipe tersebut mendukung Serialisasi Runtime.

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

✔️ PERTIMBANGKAN mendukung Serialisasi Runtime jika tipe Anda akan digunakan dengan .NET Remoting. Misalnya, System.AddIn namespace menggunakan .NET Remoting, dan karena itu semua tipe yang ditukar 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 dideserialisasi.

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

✔️ DO buat konstruktor serialisasi terproteksi dan sediakan dua parameter yang diketik dan dinamai persis seperti yang ditunjukkan dalam contoh di sini.

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

Pastikan untuk menerapkan ISerializable anggota secara eksplisit.

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

© Sebagian 2005, 2009 Microsoft Corporation. Hak cipta dilindungi oleh undang-undang

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 oleh Krzysztof Cwalina dan Brad Abrams, diterbitkan 22 Okt 2008 oleh Addison-Wesley Professional sebagai bagian dari Seri Pengembangan Microsoft Windows.

Lihat juga