Apa itu [Serializable] dan kapan saya harus menggunakannya?

Jawaban:

368

Apa itu?

Saat Anda membuat objek di aplikasi .Net framework, Anda tidak perlu memikirkan bagaimana data disimpan dalam memori. Karena .Net Framework mengurusnya untuk Anda. Namun, jika Anda ingin menyimpan konten suatu objek ke file, mengirim objek ke proses lain atau mengirimkannya ke seluruh jaringan, Anda harus memikirkan bagaimana objek tersebut diwakili karena Anda perlu mengonversi ke format lain. . Konversi ini disebut SERIALISASI.

Penggunaan untuk Serialisasi

Serialisasi memungkinkan pengembang untuk menyimpan keadaan suatu objek dan membuatnya kembali sesuai kebutuhan, menyediakan penyimpanan objek serta pertukaran data. Melalui serialisasi, pengembang dapat melakukan tindakan seperti mengirim objek ke aplikasi jarak jauh dengan menggunakan Layanan Web, meneruskan objek dari satu domain ke domain lain, melewati objek melalui firewall sebagai string XML, atau menjaga keamanan atau khusus pengguna informasi lintas aplikasi.

Berlaku SerializableAttributeuntuk jenis yang menunjukkan bahwa contoh jenis ini dapat diserialisasi. Terapkan SerializableAttributebahkan jika kelas juga mengimplementasikan ISerializableantarmuka untuk mengontrol proses serialisasi.

Semua bidang publik dan pribadi dalam jenis yang ditandai oleh SerializableAttributeserialisasi secara default, kecuali jika jenis mengimplementasikan ISerializableantarmuka untuk mengganti proses serialisasi. Proses serialisasi default tidak termasuk bidang yang ditandai dengan NonSerializedAttribute. Jika bidang jenis serializable berisi pointer, pegangan, atau beberapa struktur data lain yang khusus untuk lingkungan tertentu, dan tidak dapat direkonstitusi secara bermakna di lingkungan yang berbeda, maka Anda mungkin ingin menerapkan NonSerializedAttributebidang itu.

Lihat MSDN untuk detail lebih lanjut.

Edit 1

Alasan apa pun untuk tidak menandai sesuatu sebagai serializable

Saat mentransfer atau menyimpan data, Anda hanya perlu mengirim atau menyimpan data yang diperlukan. Jadi akan ada sedikit keterlambatan transfer dan masalah penyimpanan. Jadi, Anda dapat menyisih data yang tidak perlu saat membuat serial.

CharithJ
sumber
1
@dwbartz Pertanyaan Anda dijawab di sini tautan
jayasurya_j
2
Eksplorasi yang bagus, akan menyenangkan untuk menambahkan ini ke atribut di MSDN =)
Martea
@ jayasurya_j Sayang sekali jawaban yang diterima tidak banyak berbicara tentang bagian pribadi
Alexander
1
Penjelasan Bagus
Zakir HC
42

Beberapa kegunaan praktis untuk [Serializable]atribut:

  • Menyimpan status objek menggunakan serialisasi biner; Anda dapat dengan mudah 'menyimpan' seluruh instance objek dalam aplikasi Anda ke file atau aliran jaringan dan kemudian membuatnya kembali dengan melakukan deserialising - lihat BinaryFormatterkelas di System.Runtime.Serialization.Formatters.Binary
  • Kelas menulis yang instance objeknya dapat disimpan di clipboard menggunakan Clipboard.SetData()- kelas nonserialisable tidak dapat ditempatkan di clipboard.
  • Kelas penulisan yang kompatibel dengan .NET Remoting; umumnya, setiap instance kelas yang Anda berikan di antara domain aplikasi (kecuali yang berasal dari MarshalByRefObject) harus serialisable.

Ini adalah kasus penggunaan paling umum yang saya temui.

Bradley Smith
sumber
42

Karena pertanyaan aslinya adalah tentang SerializableAttribute, perlu dicatat bahwa atribut ini hanya berlaku ketika menggunakan BinaryFormatter atau SoapFormatter.

Agak membingungkan, kecuali Anda benar-benar memperhatikan detailnya, kapan menggunakannya dan apa tujuan sebenarnya.

Ini TIDAK ada hubungannya dengan serialisasi XML atau JSON.

Digunakan dengan SerializableAttribute adalah Antarmuka ISerializable dan Kelas SerializationInfo. Ini juga hanya digunakan dengan BinaryFormatter atau SoapFormatter.

Kecuali jika Anda bermaksud membuat serial kelas Anda menggunakan Biner atau Sabun, jangan repot-repot menandai kelas Anda sebagai [Serializable]. Serializer XML dan JSON bahkan tidak menyadari keberadaannya.

BLaminack
sumber
16
"Ini TIDAK ada hubungannya dengan serialisasi XML atau JSON" - TERIMA KASIH! Akhirnya penjelasan mengapa saya bisa dengan senang hati membuat serialisasi kelas apa pun ke XML dengan atau tanpa atribut ini
userSteve
1
Apakah Anda punya sumber untuk ini?
Michiel van Oosterhout
"Serialisasi XML dan JSON bahkan tidak menyadari keberadaannya". Saya tidak tahu tentang itu. Ketika saya JSON memformat kelas melalui WCF nama-nama properti keluar dengan garis bawah sebelumnya jika kelas itu Serializable, dan tanpa ketika atribut itu dihapus. Jadi beberapa gangguan mungkin terjadi.
Jens
@Jens jika saya mengerti dengan benar JSON.net tidak peduli sedikit pun tentang hal itu tetapi asp.net sedikit mengubah perilaku ini. Saya percaya Anda dapat menghindari ini dengan atribut JsonObject / JsonProperty.
Pangkalan
29

Serialisasi adalah proses mengubah objek menjadi aliran byte untuk menyimpan objek atau mengirimkannya ke memori, database, atau file.

Bagaimana Serialisasi Bekerja

Ilustrasi ini menunjukkan keseluruhan proses serialisasi.

masukkan deskripsi gambar di sini

Objek serial ke aliran, yang tidak hanya membawa data, tetapi informasi tentang jenis objek, seperti versi, budaya, dan nama rakitan. Dari aliran itu, dapat disimpan dalam database, file, atau memori.

Detail dalam msdn.

Mahbubur Rahman
sumber
14

Serialisasi

Serialisasi adalah proses mengubah suatu objek atau satu set objek grafik menjadi aliran, itu adalah array byte dalam kasus serialisasi biner

Penggunaan Serialisasi

  1. Untuk menyimpan keadaan suatu objek ke dalam file, database, dll. Dan menggunakannya yang terakhir.
  2. Untuk mengirim objek dari satu proses ke proses lainnya (App Domain) pada mesin yang sama dan juga mengirimkannya melalui kabel ke proses yang berjalan pada mesin lain.
  3. Untuk membuat tiruan dari objek asli sebagai cadangan saat bekerja pada objek utama.
  4. Seperangkat objek dapat dengan mudah disalin ke clipboard sistem dan kemudian ditempelkan ke aplikasi yang sama atau yang lain

Di bawah ini adalah beberapa atribut khusus yang berguna yang digunakan selama serialisasi suatu objek

[Serializable] -> Digunakan ketika kita menandai serializable objek [NonSerialized] -> Ini digunakan ketika kita tidak ingin membuat serialisasi bidang objek. [OnSerializing] -> Digunakan ketika kita ingin melakukan beberapa aksi saat membuat serial objek [OnSerialized] -> Ini digunakan ketika kita ingin melakukan beberapa tindakan setelah membuat serial objek pada aliran.

Di bawah ini adalah contoh serialisasi

[Serializable]
    internal class DemoForSerializable
    {
        internal string Fname = string.Empty;
        internal string Lname = string.Empty;

        internal Stream SerializeToMS(DemoForSerializable demo)
        {
            DemoForSerializable objSer = new DemoForSerializable();
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, objSer);
            return ms;
        }

        [OnSerializing]
        private void OnSerializing(StreamingContext context) {
            Fname = "sheo";
            Lname = "Dayal";
        }
        [OnSerialized]
        private void OnSerialized(StreamingContext context)
        {
       // Do some work after serialized object
        }

    }

Ini kode panggilannya

class Program
    {
        string fname = string.Empty;
        string Lname = string.Empty; 

       static void Main(string[] args)
        {
            DemoForSerializable demo = new DemoForSerializable();

            Stream ms = demo.SerializeToMS(demo);
            ms.Position = 0;

            DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;

            Console.WriteLine(demo1.Fname);
            Console.WriteLine(demo1.Lname);
            Console.ReadLine();
        }

    }
Sheo Dayal Singh
sumber