JavaRush /Java Blog /Random-ID /13 pertanyaan teratas tentang serialisasi dalam wawancara...
Dmitry Vasilyev
Level 26
Саратов

13 pertanyaan teratas tentang serialisasi dalam wawancara

Dipublikasikan di grup Random-ID
Terjemahan artikel https://javarevisited.blogspot.com/2011/04/top-10-java-serialization-interview.html Apa itu serialisasi di Java? Serialisasi merupakan salah satu konsep penting yang cukup jarang digunakan sebagai solusi untuk menyelamatkan keadaan program dan oleh karena itu API ini sering diabaikan oleh para pengembang. Namun, menurut pengalaman saya, serialisasi adalah topik yang cukup penting dalam setiap wawancara dasar Java. Hampir setiap wawancara yang saya temui memiliki satu atau dua pertanyaan tentang serialisasi, dan saya telah melihat kandidat merasa tidak nyaman dengan kurangnya pengalaman mereka di bidang ini setelah beberapa pertanyaan tentang topik ini. Mereka tidak mengetahui cara membuat serialisasi suatu objek di Java, mereka tidak mengetahui contoh serialisasi apa pun, dan tidak dapat menjelaskan mekanisme kerjanya, perbedaan antara variabel transien dan variabel volatil, mereka tidak mengetahui berapa banyak metode antarmuka Serializable memiliki. Apa itu antarmuka penanda? Apa tujuannya? Apa perbedaan antara implementasi Externalizable dan Serializable di Java? Mengapa Java tidak mengganti Serializable dengan @Serializable setelah memperkenalkan anotasi? Pada artikel ini, kami akan membahas pertanyaan-pertanyaan untuk pemula dan pengembang tingkat lanjut, yang dapat berguna bagi semua orang: dari pengembang junior hingga senior. Sebagian besar proyek komersial menggunakan database, file yang dipetakan memori , atau sekadar file datar untuk memberikan ketahanan yang lebih baik, namun hanya sedikit yang mengandalkan proses serialisasi Java. Bagaimanapun, postingan ini bukanlah tutorial - ini lebih merupakan tentang pertanyaan-pertanyaan yang perlu diklarifikasi sendiri sebelum melakukan wawancara Java dan dikejutkan oleh istilah-istilah yang tidak Anda ketahui. Bagi yang belum familiar dengan serialisasi Java sama sekali: “Serialisasi di Java adalah proses yang digunakan untuk membuat serialisasi suatu objek di Java dengan menyimpan status objek dalam file berekstensi .ser dan membuat ulang status objek. dari berkas ini. Proses sebaliknya ini disebut deserialisasi. sepulka Java Serialization API memberi pengembang mekanisme standar untuk membuat serialisasi objek menggunakan antarmuka Serializable dan Externalizable. Omong-omong, artikel ini merupakan kelanjutan dari artikel saya sebelumnya ( bukan milik saya, penerjemah, tetapi penulis asli bahasa Inggris) : 20 pertanyaan wawancara tentang pola desain dan 10 pertanyaan wawancara tentang pola Singleton di Java . Jadi ayo pergi! Apa itu serialisasi di Java? Serialisasi objek di Java adalah proses yang digunakan untuk mengubah objek menjadi format biner yang dapat disimpan ke disk atau dikirim melalui jaringan ke mesin virtual Java lain yang berjalan; proses kebalikan dari pembuatan objek dari aliran biner disebut deserialisasi. Java menyediakan API yang mencakup java.io.Serializable, java.io.Externalizable, ObjectInputStream dan ObjectOutputStream dll. Pemrogram bebas menggunakan mekanisme serialisasi default yang digunakan Java berdasarkan struktur kelas, namun mereka juga dapat menggunakan format biner khusus mereka sendiri, yang sering direkomendasikan sebagai praktik terbaik serialisasi karena format biner serial menjadi bagian dari API kelas yang diekspor. dan berpotensi merusak enkapsulasi di Java yang disediakan oleh bidang privat dan paket-pribadi . Secara umum, informasi ini sudah cukup untuk memulai. Bagaimana cara membuat kelas Java dapat diserialkan? Ini sangat mudah. Kelas Anda hanya perlu mengimplementasikan antarmuka java.io.Serializable dan JVM akan menangani serialisasi objek dalam format default. Keputusan untuk membuat kelas yang dapat diserialkan harus dibuat secara singkat karena, meskipun biaya jangka pendek untuk membuat kelas yang dapat diserialkan rendah, biaya jangka panjangnya cukup besar dan berpotensi membatasi kemampuan Anda untuk melakukan modifikasi lebih lanjut pada implementasi. Hal ini terjadi karena, seperti API publik lainnya, bentuk objek berseri menjadi bagian dari API publik, dan ketika Anda mengubah struktur kelas Anda dengan mengimplementasikan antarmuka tambahan, menambahkan atau menghapus bidang apa pun berpotensi merusak serialisasi default. Namun, hal ini dapat diminimalkan dengan menggunakan format biner khusus, namun masih memerlukan banyak upaya untuk memastikan kompatibilitas ke belakang. Salah satu contoh bagaimana serialisasi dapat membatasi kemampuan Anda untuk mengubah kelas adalah bidang SerialVersionUID. Jika Anda tidak mendeklarasikan SerialVersionUID secara eksplisit, maka mesin virtual akan membuatnya berdasarkan struktur kelas, yang bergantung pada antarmuka yang diterapkan oleh kelas dan beberapa faktor lain yang dapat diubah. Katakanlah Anda mengimplementasikan antarmuka yang berbeda dibandingkan dengan JVM, yang akan menghasilkan SerialVersionUID yang berbeda untuk versi baru file kelas, dan ketika Anda mencoba memuat objek lama yang diserialkan oleh versi lama program Anda, Anda akan mendapatkan Pengecualian Kelas Tidak Valid. Pertanyaan 1) Apa perbedaan antara antarmuka Serializable dan Externalizable di Java? Ini adalah pertanyaan wawancara serialisasi Java yang paling sering ditanyakan. Antarmuka Externalizable memberi kita metode writeExternal() dan readExternal(), yang memberi kita fleksibilitas untuk mengontrol serialisasi daripada mengandalkan mekanisme default. Implementasi antarmuka Externalizable yang tepat dapat meningkatkan kinerja aplikasi secara signifikan. Pertanyaan 2) Berapa banyak metode yang dimiliki Serializable? Jika tidak ada metode, lalu apa tujuan dari antarmuka Serializable? Antarmuka serializable ada dalam paket java.io dan membentuk inti mesin serialisasi Java. Itu tidak memiliki metode apa pun dan juga disebut antarmuka penanda di Java. Ketika kelas Anda mengimplementasikan antarmuka java.io.Serializable, kelas tersebut menjadi dapat serial. Itu mudah. Pertanyaan 3) Apa itu serialVersionUID? Apa yang terjadi jika Anda tidak mendefinisikannya? Salah satu pertanyaan wawancara serialisasi Java favorit saya. SerialVersionUID adalah pengenal yang diletakkan pada suatu objek ketika diserialkan, biasanya kode hash dari objek tersebut. Anda dapat menggunakan alat serialver untuk mendapatkan serialVersionUID dari objek serial. SerialVersionUID digunakan untuk kontrol versi objek. Anda juga dapat menentukan serialVersionUID di file kelas Anda secara manual. Konsekuensi dari tidak menentukan serialVersionUID adalah jika Anda menambah atau mengubah bidang apa pun di suatu kelas, kelas yang sudah diserialisasi tidak akan dapat dipulihkan karena serialVersionUID yang dihasilkan untuk kelas baru akan berbeda dari bidang yang sama dari objek serial yang lama. Proses serialisasi Java bergantung pada serialVersionUID yang benar untuk memulihkan status objek serial dan menampilkan java.io.InvalidClassException jika ada ketidakcocokan. Untuk mempelajari lebih lanjut tentang serialversionuid, lihat di sini . Pertanyaan 4) Saat membuat serial, apakah Anda ingin beberapa anggota tidak dibuat serial? Bagaimana cara mencapainya? Pertanyaan wawancara serialisasi lainnya yang sering ditanyakan. Terkadang orang juga bertanya bagaimana variabel transien digunakan, apakah variabel transien dan statis diserialisasi atau tidak, dll., jadi jika Anda tidak ingin bidang apa pun menjadi bagian dari status objek, nyatakan sebagai statis atau sementara tergantung sesuai kebutuhan Anda, dan itu tidak akan disertakan dalam proses serialisasi Java. Pertanyaan 5) Apa yang terjadi jika salah satu anggota kelas tidak mengimplementasikan antarmuka Serializable? Salah satu pertanyaan sederhana tentang proses serialisasi di Java. Jika Anda mencoba membuat serialisasi objek kelas yang mengimplementasikan Serializable, tetapi objek tersebut menyertakan referensi ke kelas yang bukan Serializable, maka NotSerializableException akan dilemparkan saat runtime, dan itulah mengapa saya selalu memasang SerializableAlert (bagian komentar di my kode), salah satu teknik komentar kode terbaik adalah menginstruksikan pengembang untuk mengingat fakta ini ketika menambahkan bidang baru ke kelas Serializable. Pertanyaan 6) Jika suatu kelas dapat diserialkan tetapi superkelasnya tidak, bagaimana keadaan variabel instan yang diwarisi dari superkelas setelah deserialisasi? Proses serialisasi Java hanya berlanjut dalam hierarki objek selama kelas mengimplementasikan antarmuka Serializable dan nilai variabel yang diwarisi dari superclass akan diinisialisasi dengan memanggil konstruktor superclass non-serializable selama proses deserialisasi. Setelah rantai konstruktor dimulai, tidak ada cara untuk menghentikannya, jadi meskipun kelas yang lebih tinggi dalam hierarki (tidak) mengimplementasikan antarmuka Serializable , konstruktor akan dieksekusi. Pertanyaan wawancara serialisasi ini mungkin terlihat sangat sulit, namun jika Anda sudah familiar dengan konsep kuncinya, itu tidak akan sulit. Pertanyaan 7) Bisakah Anda menyesuaikan proses serialisasi atau mengganti proses serialisasi default di Java? Jawabannya adalah ya, Anda bisa. Kita semua tahu bahwa untuk membuat serial suatu objek, ObjectOutputStream.writeObject(saveThisObject) dipanggil dan untuk membaca suatu objek, ObjectInputStream.readObject() dipanggil, tetapi ada satu hal lagi yang disediakan oleh Java Virtual Machine untuk Anda - mendefinisikan kedua metode ini di kelasmu. Jika Anda mendefinisikannya di kelas Anda, JVM akan memanggil kedua metode ini alih-alih menggunakan mekanisme serialisasi default. Di sini Anda dapat mengonfigurasi perilaku serialisasi dan deserialisasi objek dengan melakukan tugas prapemrosesan atau pascapemrosesan apa pun. Penting untuk dicatat bahwa metode ini harus bersifat pribadi untuk menghindari pewarisan, penggantian, atau kelebihan beban. Karena hanya Mesin Virtual Java yang dapat memanggil metode privat, integritas kelas Anda akan dipertahankan dan serialisasi akan berfungsi seperti biasa. Menurut pendapat saya, ini adalah salah satu pertanyaan terbaik yang dapat ditanyakan dalam setiap wawancara Serialisasi Java. Pertanyaan lanjutan yang bagus adalah: mengapa Anda perlu menyediakan formulir serial khusus untuk objek Anda? Pertanyaan 8) Misalkan superclass dari kelas baru mengimplementasikan antarmuka Serializable, bagaimana kita bisa menghindari serialisasi kelas baru? Salah satu pertanyaan wawancara sulit tentang Serialisasi di Java. Jika superkelas suatu kelas sudah mengimplementasikan antarmuka Serializable di Java, maka kelas turunannya juga bisa Serializable, karena Anda tidak bisa tidak mengimplementasikan antarmuka induknya, dan tidak mungkin menjadikannya kelas Non Serializable. Namun, ada cara untuk menghindari serialisasi untuk kelas baru ini. Untuk melakukannya, Anda perlu mengimplementasikan metode writeObject() dan readObject() dan membuang NotSerializableException dari metode ini. Pertanyaan ini biasanya ditanyakan sebagai pertanyaan tambahan seiring berlangsungnya wawancara. Pertanyaan 9) Apa saja metode yang digunakan dalam proses serialisasi dan deserialisasi di Java? Ini adalah pertanyaan yang sangat umum dalam serialisasi. Apa yang pewawancara coba cari tahu dalam kasus ini? Apakah Anda familiar dengan penggunaan readObject(), writeObject(), readExternal() dan writeExternal() atau tidak. Serialisasi Java dilakukan oleh kelas java.io.ObjectOutputStream. Kelas ini adalah aliran terfilter yang melilit aliran byte tingkat rendah untuk menangani mesin serialisasi. Untuk menyimpan objek apa pun menggunakan mekanisme serialisasi, kita memanggil ObjectOutputStream.writeObject(saveThisObject) dan untuk membatalkan serialisasi objek tersebut, kita memanggil metode ObjectInputStream.readObject(). Memanggil metode writeObject() akan memulai proses serialisasi. Satu hal penting yang perlu diperhatikan tentang metode readObject() adalah metode ini digunakan untuk membaca byte dan membuat serta mengembalikan objek dari byte tersebut, yang pada gilirannya harus dilemparkan ke tipe yang benar. Pertanyaan 10) Misalkan Anda memiliki kelas yang telah Anda serialkan dan simpan, lalu Anda memodifikasi kelas tersebut untuk menambahkan bidang baru. Apa yang terjadi jika Anda membatalkan serialisasi objek yang sudah diserialisasi? Itu tergantung pada apakah kelas memiliki serialVersionUID sendiri atau tidak. Seperti yang kita ketahui dari pertanyaan di atas, jika kita tidak menyediakan serialVersionUID dalam kode kita, compiler java akan menghasilkannya sendiri dan biasanya akan sama dengan kode hash objek tersebut. Setelah menambahkan bidang baru, ada kemungkinan serialVersionUID baru yang dihasilkan untuk versi kelas tersebut tidak cocok dengan objek yang sudah diserialisasi, dalam hal ini API akan memunculkan java.io.InvalidClassException. Oleh karena itu, disarankan untuk memiliki serialVersionUID Anda sendiri dalam kode Anda, yang selalu sama untuk kelas yang sama. Pertanyaan 11) Apa saja perubahan yang kompatibel dan tidak kompatibel dalam mekanisme serialisasi Java? Masalah sebenarnya adalah mengubah struktur kelas dengan menambahkan bidang, metode apa pun, atau menghapus bidang atau metode apa pun dengan objek yang sudah diserialisasi. Menurut spesifikasi Serialisasi Java, penambahan bidang atau metode apa pun akan mengalami perubahan yang kompatibel dan perubahan hierarki kelas atau antarmuka Serializable yang mengimplementasikan PBB, beberapa di bawah perubahan yang tidak kompatibel). Untuk daftar lengkap perubahan yang kompatibel dan tidak kompatibel, saya sarankan membaca Spesifikasi Serialisasi Java. Pertanyaan 12) Bisakah kita mentransfer objek berseri melalui jaringan? Ya, Anda dapat meneruskan objek serial melalui jaringan karena objek serial Java adalah kumpulan byte yang dapat diteruskan dengan cara apa pun. Anda juga dapat menyimpan objek serial pada disk atau database sebagai Blob. Pertanyaan 13) Jenis variabel apa yang tidak diserialkan selama serialisasi Java? Pertanyaan ini terkadang ditanyakan secara berbeda, tetapi tujuannya sama: untuk mengetahui apakah pengembang Java mengetahui secara spesifik serialisasi variabel statis dan sementara. Karena variabel statis milik kelas dan bukan objek, maka variabel tersebut bukan bagian dari status objek, sehingga tidak dipertahankan selama proses serialisasi Java. Karena serialisasi Java hanya menyimpan status suatu objek dan bukan objek itu sendiri, variabel sementara juga tidak disertakan dalam proses serialisasi dan bukan bagian dari status serial objek. Setelah pertanyaan ini, mungkin pewawancara akan bertanya: Jika Anda tidak menyimpan nilai variabel-variabel ini, lalu berapa nilai variabel-variabel ini setelah deserialisasi dan pembuatan ulang objek ini? Dan ini rekan-rekan, pikirkan sendiri :) Artikel aslinya ada di sini .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION