Apa Tujuan Serialisasi di Java?

105

Saya telah membaca cukup banyak artikel tentang Serialization dan bagaimana itu sangat bagus dan hebat tetapi tidak ada argumen yang cukup meyakinkan. Saya bertanya-tanya apakah seseorang benar-benar dapat memberi tahu saya apa yang sebenarnya dapat kita capai dengan membuat serial kelas?

m_a_khan
sumber
10
Apa yang "tidak meyakinkan" tentang argumen mereka? Dan mengapa Anda belum menerima jawaban atas pertanyaan Anda?
Anon.
8
Dia "tidak yakin" mereka menjawab pertanyaannya.
Anthony Forloney
5
Jawaban yang diberikan ternyata benar. Jika mereka tidak berhasil untuk Anda, balas mereka sebagai komentar dan cobalah untuk menyelesaikannya alih-alih hanya mengabaikan mereka dan kemudian mulai memecat orang lain ketika mereka menunjukkan Anda tidak menggunakan SO dengan benar.
Anon.
4
Anon berkontribusi pada kualitas situs dengan mencegah pertanyaan ganda. Konyol melihat lima pertanyaan terpisah yang semuanya menanyakan hal yang sama. Jika Anda tidak bisa mendapatkan jawaban, terkadang begitulah adanya. Jika Anda mendapatkan jawaban tetapi sepertinya tidak berhasil, lanjutkan diskusi di komentar. SO bukanlah kotak ajaib yang secara ajaib akan memberi Anda jawaban jika Anda hanya mengajukan pertanyaan yang tepat, atau bertanya cukup banyak, atau menarik perhatian ahli yang tepat.
Chris
1
Baik: (Terima jawabannya) atau (Posting komentar dan / atau ubah pertanyaan yang menjelaskan mengapa itu bukan yang Anda butuhkan).
Anon.

Jawaban:

182

Mari kita definisikan serialisasi terlebih dahulu, lalu kita bisa membahas mengapa serialisasi sangat berguna.

Serialisasi hanya mengubah objek yang ada menjadi array byte. Larik byte ini mewakili kelas objek, versi objek, dan status internal objek. Larik byte ini kemudian dapat digunakan antara JVM yang menjalankan kode yang sama untuk mengirimkan / membaca objek.

Mengapa kami ingin melakukan ini?

Ada beberapa alasan:

  • Komunikasi: Jika Anda memiliki dua mesin yang menjalankan kode yang sama, dan mereka perlu berkomunikasi, cara mudah bagi satu mesin untuk membuat objek dengan informasi yang ingin dikirim, dan kemudian membuat serial objek itu ke mesin lain. Ini bukan metode terbaik untuk komunikasi, tetapi itu menyelesaikan pekerjaan.

  • Persistensi: Jika Anda ingin menyimpan status operasi tertentu dalam database, itu dapat dengan mudah diserialkan ke array byte, dan disimpan dalam database untuk pengambilan nanti.

  • Deep Copy: Jika Anda memerlukan replika yang tepat dari sebuah Objek, dan tidak ingin repot-repot menulis kelas clone () khusus Anda sendiri, cukup membuat serial objek ke byte array, dan kemudian de-serialisasi ke yang lain objek mencapai tujuan ini.

  • Caching: Benar-benar hanya aplikasi di atas, tetapi terkadang sebuah objek membutuhkan 10 menit untuk membuatnya, tetapi hanya membutuhkan 10 detik untuk membatalkan serialisasi. Jadi, daripada menyimpan objek raksasa di memori, cukup cache ke file melalui serialisasi, dan baca nanti saat diperlukan.

  • Sinkronisasi Lintas JVM: Serialisasi bekerja di berbagai JVM yang mungkin berjalan pada arsitektur yang berbeda.

Schmelter
sumber
62
Apa yang dibutuhkan 10 menit untuk membangunnya?
oxbow_lakes
2
Maksud saya adalah (tentu saja) bahwa file I / O yang terlibat dalam serialisasi kemungkinan besar akan mengerdilkan overhead pembuatan objek murni. Saya kira Anda mungkin berbicara tentang sesuatu yang sangat mahal secara komputasi seperti pemodelan ilmiah tetapi serialisasi adalah mekanisme yang sangat buruk untuk ketekunan karena sulit untuk menangani perubahan skema
oxbow_lakes
11
@oxbow_lakes Sebuah contoh mungkin terjadi jika Anda mempertahankan indeks dari kumpulan data tertentu untuk pencarian cepat. Indeks seperti itu dapat membutuhkan waktu yang sangat lama untuk dibuat, tetapi setelah Anda membuatnya, indeks dapat diserialkan / dideserialisasikan dengan relatif cepat.
David
Jika permintaan aplikasi web harus melewati setiap router di globe sebelum mencapai tujuan, membuat objek, kembali dengan objek menggunakan jalur terpanjang, Ya, ini bisa memakan waktu 10 menit.
Vaibs
@ Schmelter, Karena Anda menyebutkan Serialisasi bukan metode terbaik untuk komunikasi, mana metode yang tepat dan terbaik untuk diterapkan?
Ashfaque Rifaye
58

Saat Anda menjalankan aplikasi, semua objeknya disimpan dalam memori (RAM). Saat Anda keluar, memori tersebut akan diklaim kembali oleh sistem operasi, dan program Anda pada dasarnya 'melupakan' semua yang terjadi saat sedang berjalan. Serialisasi memperbaiki hal ini dengan membiarkan aplikasi Anda menyimpan objek ke disk sehingga dapat membacanya kembali saat aplikasi dimulai. Jika aplikasi Anda akan menyediakan cara apa pun untuk menyimpan / berbagi status sebelumnya, Anda memerlukan beberapa bentuk serialisasi.

Gordon Gustafson
sumber
2
Jadi, sepertinya ini adalah cara yang lebih baik dan lebih efisien untuk menulis data ke file dan membacanya kembali saat diperlukan?
m_a_khan
1
Ini adalah satu-satunya penjelasan NYATA. Saya tidak bisa memikirkan aplikasi dunia nyata lainnya dari serialisasi +1
Emily
Pendek dan manis. Penjelasan yang sempurna.
Yakhoob
21

Saya dapat berbagi cerita saya dan saya berharap ini akan memberi beberapa ide mengapa serialisasi itu perlu. Namun, jawaban atas pertanyaan Anda sudah sangat detail.

Saya memiliki beberapa proyek yang perlu memuat dan membaca banyak file teks. File-file tersebut berisi kata-kata berhenti, kata kerja biomedis, singkatan-singkatan biomedis, kata-kata yang terhubung secara semantik satu sama lain, dll. Isi dari file-file ini sederhana: kata-kata !

Sekarang untuk setiap proyek, saya perlu membaca kata-kata dari masing-masing file ini dan memasukkannya ke dalam array yang berbeda; karena konten file tidak pernah berubah, itu menjadi tugas yang umum, betapapun mubazirnya, setelah proyek pertama.

Jadi, yang saya lakukan adalah membuat satu objek untuk membaca masing-masing file ini dan mengisi array individu (variabel instan objek). Kemudian saya membuat serial objek dan kemudian untuk proyek selanjutnya, saya hanya men-deserialisasi mereka. Saya tidak perlu membaca file dan mengisi array lagi dan lagi.

Rushdi Shams
sumber
1
Dalam kasus seperti itu, mengapa Anda perlu menyimpannya dalam aliran array byte (menggunakan serialize), dapatkah ini lebih sederhana daripada hanya menggunakan kolom sementara?
kidnan1991
3

Intinya :

Serialisasi adalah proses mengubah sekumpulan contoh objek yang berisi referensi satu sama lain menjadi aliran linear byte, yang kemudian dapat dikirim melalui soket, disimpan ke file, atau dimanipulasi sebagai aliran data.

Lihat penggunaan dari Wiki :

Serialisasi memiliki sejumlah keunggulan. Ini menyediakan:

  1. metode menahan objek yang lebih nyaman daripada menulis propertinya ke file teks pada disk, dan menyusunnya kembali dengan membacanya kembali.
  2. metode mengeluarkan panggilan prosedur jarak jauh, misalnya, seperti dalam SOAP
  3. metode untuk mendistribusikan objek, terutama dalam komponen perangkat lunak seperti COM, CORBA, dll.
  4. sebuah metode untuk mendeteksi perubahan dalam data yang berubah-ubah waktu.
Kolam
sumber
1

Yang paling jelas adalah Anda dapat mengirimkan kelas berseri melalui jaringan, dan penerima dapat membuat duplikat dari instanstance asli. Demikian pula, Anda dapat menyimpan struktur berseri ke sistem file.

Juga, perhatikan bahwa serialisasi bersifat rekursif, sehingga Anda dapat membuat serialisasi seluruh struktur data heterogen dalam satu gelombang besar, jika diinginkan.

ddyer
sumber
0

Objek berseri mempertahankan status di ruang angkasa, mereka dapat ditransfer melalui jaringan, sistem file, dll ... dan waktu, mereka dapat hidup lebih lama dari JVM yang membuatnya.

Terkadang ini berguna.

David Soroko
sumber
Ini dapat dicapai dengan file sederhana yang berisi beberapa teks juga. Sedikit lebih mudah dalam membaca kembali objek berseri kemudian membaca status objek yang ditulis ke file teks, bukan?
m_a_khan
@m_a_khan: Wah. Ya, itu bisa dilakukan dengan teks sederhana. Tapi begitu Objek menjadi lebih kompleks, atau lebih baik struktur mereka (komposisi, pewarisan) menjadi lebih kompleks, akan merepotkan untuk secara manual (membatalkan) menyusunnya. Bayangkan memiliki daftar, set, dan peta sebagai anggota objek.
Dirk Schumacher
Sangat mudah untuk membuat skema serialisasi yang berbeda dan memang banyak yang ada. Untuk alasan yang sangat bagus, tidak satupun dari mereka menghasilkan kasus umum, dalam "teks sederhana"
David Soroko
0

Saya menggunakan objek serial untuk menstandarisasi argumen yang saya berikan ke fungsi atau konstruktor kelas. Meneruskan satu kacang berseri jauh lebih bersih daripada daftar panjang argumen. Hasilnya adalah kode yang lebih mudah dibaca dan di-debug.

Ron Norman
sumber
1
Menurut pendapat saya searialisasi dan menggunakan objek konfigurasi tunggal sebagai parameter cukup ortogonal. Mungkin ini bukan kasus penggunaan biasa.
Gábor Bakos
0

Untuk tujuan pembelajaran yang sederhana (perhatikan, saya mengatakan belajar, saya tidak mengatakan yang terbaik, atau bahkan bagus, tetapi hanya untuk memahami hal-hal), Anda dapat menyimpan data Anda ke file teks di komputer, kemudian memiliki program yang membaca info itu, dan berdasarkan file tersebut, program Anda bisa merespons secara berbeda. Jika Anda lebih mahir, itu tidak harus berupa file txt, tetapi sesuatu yang lain.

Serialisasi di sisi lain, menempatkan sesuatu secara langsung ke dalam bahasa komputer. Ini seperti Anda memberi tahu komputer Spanyol sesuatu dalam bahasa Spanyol, daripada mengatakan sesuatu dalam bahasa Prancis, memaksanya untuk belajar bahasa Prancis, lalu menyimpan sesuatu ke dalam bahasa aslinya Spanyol dengan menerjemahkan semuanya. Bukan jawaban yang paling intensif teknologi, saya hanya mencoba membuat contoh yang dapat dimengerti dalam format bahasa yang umum.

Serialisasi juga lebih cepat, karena di Java, objek ditangani di heap, dan memakan waktu lebih lama daripada jika direpresentasikan sebagai primitif di tumpukan. Kecepatan, kecepatan, kecepatan. Dan lebih sedikit pemrosesan file dari sudut pandang programmer.

JCoder
sumber
Ketika mencoba untuk menjelaskan sesuatu dalam bahasa Inggris yang sederhana, Anda belum benar-benar menjelaskan serialisasi dengan cara yang berguna.
pengguna3516726