Apa yang dimaksud dengan "serialisasi objek"? Bisakah Anda jelaskan dengan beberapa contoh?
java
serialization
object-serialization
pejuang
sumber
sumber
Jawaban:
Serialisasi adalah konversi suatu objek ke serangkaian byte, sehingga objek tersebut dapat dengan mudah disimpan ke penyimpanan persisten atau dialirkan melalui tautan komunikasi. Aliran byte kemudian dapat deserialized - dikonversi menjadi replika objek asli.
sumber
Anda dapat menganggap serialisasi sebagai proses mengubah instance objek menjadi urutan byte (yang mungkin biner atau tidak tergantung pada implementasinya).
Ini sangat berguna ketika Anda ingin mengirimkan satu objek data di jaringan, misalnya dari satu JVM ke yang lain.
Di Jawa, mekanisme serialisasi dibangun ke platform, tetapi Anda perlu mengimplementasikan antarmuka Serializable untuk membuat objek serializable.
Anda juga dapat mencegah beberapa data di objek Anda menjadi serial dengan menandai atributnya sebagai sementara .
Akhirnya Anda dapat mengganti mekanisme default, dan menyediakan mekanisme Anda sendiri; ini mungkin cocok dalam beberapa kasus khusus. Untuk melakukan ini, Anda menggunakan salah satu fitur tersembunyi di java .
Penting untuk diperhatikan bahwa yang diserialkan adalah "nilai" dari objek, atau konten, dan bukan definisi kelas. Dengan demikian metode tidak serial.
Berikut ini adalah contoh yang sangat mendasar dengan komentar untuk memudahkan pembacaannya:
Ketika kita menjalankan program ini, file "o.ser" dibuat dan kita dapat melihat apa yang terjadi di belakang.
Jika kita mengubah nilai: someInteger ke, misalnya Integer.MAX_VALUE , kita dapat membandingkan output untuk melihat apa perbedaannya.
Berikut screenshot yang menunjukkan perbedaan itu:
Bisakah Anda melihat perbedaannya? ;)
Ada bidang tambahan yang relevan dalam serialisasi Java: The serialversionUID tapi saya kira ini sudah terlalu lama untuk membahasnya.
sumber
SerializationSample
SerializationSample instance = new SerializationSample();
kemudian output dibuat dan objek ditulis ke output itu.Berani menjawab pertanyaan 6 tahun, hanya menambah pemahaman tingkat tinggi bagi orang-orang baru di Jawa
Mengubah objek menjadi byte
Mengkonversi byte kembali ke objek (Deserialization).
Ketika kita ingin Bertahan Objek. Ketika kita ingin objek ada di luar masa pakai JVM.
ATM: Ketika pemegang akun mencoba untuk menarik uang dari server melalui ATM, informasi pemegang akun seperti detail penarikan akan diserialisasi dan dikirim ke server di mana detailnya di-deserialisasi dan digunakan untuk melakukan operasi.
Implement
java.io.Serializable
antarmuka (penanda antarmuka sehingga tidak ada metode untuk diterapkan).Tetap objek: Gunakan
java.io.ObjectOutputStream
kelas, aliran filter yang merupakan pembungkus di sekitar aliran byte tingkat yang lebih rendah (untuk menulis objek ke sistem file atau mentransfer objek diratakan di kawat jaringan dan dibangun kembali di sisi lain).writeObject(<<instance>>)
- untuk menulis objekreadObject()
- untuk membaca Obyek berseriSaat Anda membuat serial objek, hanya status objek yang akan disimpan, bukan file atau metode kelas objek.
Ketika Anda membuat serial objek 2-byte, Anda melihat file serial 51 byte.
Jawaban untuk: Bagaimana cara dikonversi ke file 51 byte?
java.lang.Object
.Sunting : Satu lagi tautan bagus untuk dibaca.
Ini akan menjawab beberapa pertanyaan:
Bagaimana tidak membuat serialisasi bidang apa pun di kelas.
Jawab: gunakan kata kunci sementara
Ketika kelas anak diserialisasi apakah kelas induk mendapatkan serial?
Jawab: Tidak, Jika orang tua tidak memperluas bidang orang tua antarmuka Serializable jangan diserialisasi.
Ketika orang tua diserialisasi apakah kelas anak mendapatkan serial?
Jawab: Ya, secara standar kelas anak juga diserialisasi.
Bagaimana cara menghindari kelas anak dari mendapatkan serial?
Jawab: a. Mengganti metode writeObject dan readObject dan melempar
NotSerializableException
.b. Anda juga dapat menandai semua bidang sementara di kelas anak.
sumber
Serialisasi adalah mengambil objek "langsung" dalam memori dan mengubahnya menjadi format yang dapat disimpan di suatu tempat (mis. Dalam memori, pada disk) dan kemudian "deserialized" kembali menjadi objek langsung.
sumber
Saya menyukai cara hadiah @OscarRyz. Meskipun di sini saya melanjutkan kisah serialisasi yang awalnya ditulis oleh @amitgupta.
Meskipun mengetahui tentang struktur kelas robot dan memiliki data bersambung, ilmuwan Bumi tidak dapat melakukan deserialisasi data yang dapat membuat robot berfungsi.
Ilmuwan Mars sedang menunggu pembayaran lengkap. Setelah pembayaran dilakukan, para ilmuwan Mars berbagi versi serialUID dengan para ilmuwan Bumi. Ilmuwan bumi mengaturnya ke kelas robot dan semuanya menjadi baik-baik saja.
sumber
Serialisasi berarti objek yang bertahan di java. Jika Anda ingin menyimpan keadaan objek dan ingin membangun kembali keadaan nanti (mungkin dalam JVM lain) serialisasi dapat digunakan.
Perhatikan bahwa properti suatu objek hanya akan disimpan. Jika Anda ingin menghidupkan kembali objek Anda harus memiliki file kelas, karena variabel anggota hanya akan disimpan dan bukan fungsi anggota.
misalnya:
The Searializable adalah antarmuka penanda yang menandai bahwa kelas Anda bisa serial. Antarmuka penanda berarti bahwa itu hanya antarmuka kosong dan menggunakan antarmuka itu akan memberi tahu JVM bahwa kelas ini dapat dibuat berseri.
sumber
Dua sen saya dari blog saya sendiri:
Berikut adalah penjelasan rinci tentang Serialisasi : (blog saya sendiri)
Serialisasi:
Serialisasi adalah proses mempertahankan keadaan suatu objek. Itu diwakili dan disimpan dalam bentuk urutan byte. Ini dapat disimpan dalam file. Proses untuk membaca keadaan objek dari file dan mengembalikannya disebut deserialization.
Apa perlunya Serialisasi?
Dalam arsitektur modern, selalu ada kebutuhan untuk menyimpan keadaan objek dan kemudian mengambilnya. Sebagai contoh di Hibernate, untuk menyimpan objek kita harus membuat kelas Serializable. Apa yang dilakukannya, adalah bahwa begitu keadaan objek disimpan dalam bentuk byte, ia dapat ditransfer ke sistem lain yang kemudian dapat membaca dari keadaan dan mengambil kelas. Status objek dapat berasal dari database atau jvm yang berbeda atau dari komponen terpisah. Dengan bantuan Serialisasi, kita dapat mengambil status Objek.
Contoh Kode dan penjelasan:
Pertama mari kita lihat di Kelas Item:
Dalam kode di atas dapat dilihat bahwa kelas Item mengimplementasikan Serializable .
Ini adalah antarmuka yang memungkinkan kelas menjadi serializable.
Sekarang kita bisa melihat variabel yang disebut serialVersionUID diinisialisasi ke variabel Long. Angka ini dihitung oleh kompiler berdasarkan status kelas dan atribut kelas. Ini adalah angka yang akan membantu jvm mengidentifikasi keadaan suatu objek ketika membaca keadaan objek dari file.
Untuk itu kita bisa melihat di Dokumentasi Oracle resmi:
Jika Anda perhatikan ada kata kunci lain yang kami gunakan yang sementara .
Jika suatu bidang tidak serializable, itu harus ditandai sementara. Di sini kami menandai itemCostPrice sebagai sementara dan tidak ingin itu ditulis dalam file
Sekarang mari kita lihat bagaimana cara menulis status suatu objek dalam file dan kemudian membacanya dari sana.
Dalam contoh di atas kita dapat melihat contoh serialisasi dan deserialisasi objek.
Untuk itu kami menggunakan dua kelas. Untuk membuat serial objek, kami telah menggunakan ObjectOutputStream. Kami telah menggunakan metode writeObject untuk menulis objek dalam file.
Untuk Deserializing kami telah menggunakan ObjectInputStream yang membaca dari objek dari file. Menggunakan readObject untuk membaca data objek dari file.
Output dari kode di atas akan seperti:
Perhatikan bahwa itemCostPrice dari objek deserialized adalah null karena tidak ditulis.
Kami telah membahas dasar-dasar Serialisasi Jawa pada bagian I artikel ini.
Sekarang mari kita bahas secara mendalam dan bagaimana cara kerjanya.
Pertama mari kita mulai dengan cairan serial.
The serialVersionUID digunakan sebagai kontrol versi di kelas Serializable.
Jika Anda tidak secara eksplisit mendeklarasikan serialVersionUID, JVM akan melakukannya untuk Anda secara otomatis, berdasarkan berbagai properti dari kelas Serializable.
Algoritma Java Menghitung serialversionuid (Baca lebih detail di sini)
Algoritma serialisasi Java
Hal-hal yang Perlu Diingat:
Bidang statis di kelas tidak dapat diserialisasi.
Jika serialversionuid berbeda di kelas baca itu akan mengeluarkan
InvalidClassException
pengecualian.Jika suatu kelas mengimplementasikan serializable maka semua sub kelasnya juga akan serializable.
Jika suatu kelas memiliki referensi dari kelas lain, semua referensi harus Serializable jika tidak proses serialisasi tidak akan dilakukan. Dalam kasus seperti itu, NotSerializableException dilemparkan pada saat runtime.
Misalnya:
sumber
serialVersionUID
berbeda itu akan melemparInvalidClassException
, bukan aClassCastException
. Tidak perlu menyia-nyiakan semua ruang yang merespekserialVersionUID
perhitungan. Dokumentasi dikutip, terlalu panjang, tetapi tidak terkait atau dikutip dengan benar. Terlalu banyak bulu di sini dan terlalu banyak kesalahan.Serialisasi adalah proses mengubah status objek menjadi bit sehingga dapat disimpan pada hard drive. Saat Anda menghapus objek yang sama, objek itu akan mempertahankan kondisinya nanti. Ini memungkinkan Anda membuat ulang objek tanpa harus menyimpan properti objek dengan tangan.
http://en.wikipedia.org/wiki/Serialization
sumber
Serialisasi Java Object
Serialization
adalah mekanisme untuk mengubah grafik objek Java menjadi array byte untuk penyimpanan (to disk file
) atau transmisi (across a network
), maka dengan menggunakan deserialisasi kita dapat mengembalikan grafik objek. Grafik objek dipulihkan dengan benar menggunakan mekanisme berbagi referensi. Tetapi sebelum menyimpan, periksa apakah serialVersionUID dari input-file / jaringan dan .class file serialVersionUID adalah sama. Jika tidak, lempar ajava.io.InvalidClassException
.serialVersionUID sangat penting untuk proses serialisasi. Tapi itu opsional bagi pengembang untuk menambahkannya ke file sumber java. Jika serialVersionUID tidak termasuk, runtime serialisasi akan menghasilkan serialVersionUID dan mengaitkannya dengan kelas. Objek berseri akan berisi serialVersionUID ini bersama dengan data lainnya.
Catatan - Sangat disarankan bahwa semua kelas serializable secara eksplisit mendeklarasikan serialVersionUID
since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations
,, dan dengan demikian dapat mengakibatkan konflik serialVersionUID yang tidak terduga selama deserialisasi, yang menyebabkan deserialisasi gagal.Memeriksa Kelas Serializable
Sebuah kelas harus mengimplementasikan antarmuka java.io.Serializable agar serialisasi objeknya berhasil. Serializable adalah antarmuka marker dan digunakan untuk memberi tahu kompiler bahwa kelas yang mengimplementasikannya harus ditambahkan perilaku serializable. Di sini Java Virtual Machine (JVM) bertanggung jawab atas serialisasi otomatisnya.
Menerapkan antarmuka Externalizable memungkinkan objek untuk mengambil kendali penuh atas konten dan format bentuk serial objek. Metode antarmuka Externalizable, writeExternal dan readExternal, dipanggil untuk menyimpan dan mengembalikan keadaan objek. Ketika diimplementasikan oleh kelas mereka dapat menulis dan membaca keadaan mereka sendiri menggunakan semua metode ObjectOutput dan ObjectInput. Merupakan tanggung jawab objek untuk menangani versi apa pun yang terjadi.
Hanya objek yang mendukung antarmuka java.io.Serializable atau java.io.Externalizable yang dapat
written to
/read from
stream. Kelas dari setiap objek serializable dikodekan termasuk nama kelas dan tanda tangan kelas, nilai-nilai bidang dan array objek, dan penutupan objek lain yang dirujuk dari objek awal.Contoh Serializable Untuk File
Contoh Serializable Melalui Jaringan
Mendistribusikan keadaan objek di ruang alamat yang berbeda, baik dalam proses yang berbeda di komputer yang sama, atau bahkan di beberapa komputer yang terhubung melalui jaringan, tetapi bekerja bersama dengan berbagi data dan menggunakan metode.
@Lihat
sumber
JVM to JVM
Serialisasi adalah proses menyimpan suatu objek dalam media penyimpanan (seperti file, atau buffer memori) atau mengirimkannya melalui koneksi jaringan dalam bentuk biner. Objek berseri adalah JVM independen dan dapat diserialisasi ulang oleh JVM apa pun. Dalam hal ini status objek java "dalam memori" dikonversi menjadi aliran byte. Jenis file ini tidak dapat dipahami oleh pengguna. Ini adalah jenis objek khusus yaitu digunakan kembali oleh JVM (Java Virtual Machine). Proses serialisasi objek ini juga disebut deflating atau mengatur objek.
Objek yang akan diserialisasi harus mengimplementasikan
java.io.Serializable
Antarmuka. Mekanisme serialisasi default untuk objek menulis kelas objek, tanda tangan kelas, dan nilai semua bidang non-transien dan non-statis.ObjectOutput
antarmuka memperluasDataOutput
antarmuka dan menambahkan metode untuk serialisasi objek dan menulis byte ke file. TheObjectOutputStream
meluasjava.io.OutputStream
dan alatObjectOutput
antarmuka. Ini cerita bersambung objek, array, dan nilai-nilai lain ke aliran. Jadi konstruktorObjectOutputStream
ditulis sebagai:Kode di atas telah digunakan untuk membuat turunan
ObjectOutput
kelas denganObjectOutputStream( )
konstruktor yang menjadikan turunanFileOuputStream
sebagai parameter.The
ObjectOutput
antarmuka digunakan dengan menerapkanObjectOutputStream
kelas. IniObjectOutputStream
dibangun untuk membuat serial objek.Deserializing Obyek di java
Operasi berlawanan dari serialisasi disebut deserialisasi yaitu untuk mengekstrak data dari serangkaian byte yang dikenal sebagai deserialisasi yang juga disebut menggembungkan atau unmarshalling.
ObjectInputStream
memperluasjava.io.InputStream
dan mengimplementasikanObjectInput
antarmuka. Ini menghilangkan objek, array, dan nilai-nilai lainnya dari aliran input. Jadi konstruktorObjectInputStream
ditulis sebagai:Kode di atas program menciptakan turunan dari
ObjectInputStream
kelas untuk deserialize file yang telah diserialisasi olehObjectInputStream
kelas. Kode di atas membuat instance menggunakan instance dariFileInputStream
kelas yang menampung objek file yang ditentukan yang harus di-deserialisasi karenaObjectInputStream()
konstruktor memerlukan input stream.sumber
Serialisasi adalah proses mengubah objek Java menjadi byte array dan kemudian kembali ke objek lagi dengan keadaan terpelihara. Berguna untuk berbagai hal seperti mengirim objek melalui jaringan atau melakukan caching ke disk.
Baca lebih lanjut dari artikel singkat ini yang menjelaskan pemrograman bagian dari proses dengan cukup baik dan kemudian pindah ke javadoc Serializable . Anda mungkin juga tertarik membaca pertanyaan terkait ini .
sumber
Kembalikan file sebagai Obyek: http://www.tutorialspoint.com/java/java_serialization.htm
sumber
| * | Serialisasi kelas: Mengubah objek menjadi byte dan byte kembali ke objek (Deserialisasi).
| => Obyek-Serialisasi adalah proses mengubah keadaan suatu objek menjadi uap byte.
| => Object-Deserialization adalah proses mendapatkan keadaan objek dan menyimpannya ke objek (java.lang.Object).
& nbsp & nbspJika tidak membuang java.io.InvalidClassException.
| => Objek Java hanya bisa serial, jika kelasnya atau superclasses-nya
| => Bidang statis di kelas tidak dapat diserialisasi.
| => Jika Anda tidak ingin membuat serial suatu variabel dari suatu kelas, gunakan kata kunci sementara
| => Jika suatu kelas mengimplementasikan serializable maka semua sub kelasnya juga akan serializable.
| => Jika suatu kelas memiliki referensi dari kelas lain, semua referensi harus Serializable jika tidak proses serialisasi tidak akan dilakukan. Dalam kasus seperti itu,
NotSerializableException dilemparkan pada saat runtime.
sumber
Saya akan menawarkan analogi untuk berpotensi membantu dalam memperkuat tujuan konseptual / kepraktisan serialisasi objek / deserialisasi .
Saya membayangkan serialisasi objek / deserialisasi dalam konteks upaya untuk memindahkan objek melalui saluran badai. Objek ini pada dasarnya "terurai" atau serial ke versi yang lebih modular dari dirinya sendiri - dalam hal ini, serangkaian byte - untuk secara efektif diberikan bagian melalui media. Dalam pengertian komputasi, kita bisa melihat jalur yang ditempuh oleh byte melalui drain badai sama dengan byte yang bepergian melalui jaringan. Kami mentransmutasikan objek kami untuk menyesuaikan dengan moda transportasi, atau format yang lebih diinginkan. Objek serial biasanya akan disimpan dalam file biner yang nantinya dapat dibaca dari, ditulis untuk, atau keduanya.
Mungkin begitu objek kita dapat menyelinap melalui saluran sebagai serangkaian byte yang terurai, kita mungkin ingin menyimpan representasi objek tersebut sebagai data biner di dalam basis data atau hard disk drive. Namun takeaway utama, adalah bahwa dengan serialisasi / deserialisasi, kita memiliki opsi untuk membiarkan objek kita tetap dalam bentuk biner setelah serial, atau "mengambil" bentuk asli objek dengan melakukan deserialisasi.
sumber