JavaRush /Blog Java /Random-MS /13 soalan teratas tentang bersiri dalam temu bual
Dmitry Vasilyev
Tahap
Саратов

13 soalan teratas tentang bersiri dalam temu bual

Diterbitkan dalam kumpulan
Terjemahan artikel https://javarevisited.blogspot.com/2011/04/top-10-java-serialization-interview.html Apakah serialization dalam Java? Serialisasi adalah salah satu konsep penting yang agak jarang digunakan sebagai penyelesaian untuk menyelamatkan keadaan program dan oleh itu API ini sering diabaikan oleh pembangun. Walau bagaimanapun, dalam pengalaman saya, bersiri adalah topik yang cukup penting dalam mana-mana temu bual Java asas. Hampir setiap temu bual yang saya temui mempunyai satu atau dua soalan tentang penyiaran, dan saya telah melihat calon berasa tidak selesa tentang kekurangan pengalaman mereka dalam bidang ini selepas beberapa soalan mengenai topik ini. Mereka tidak tahu bagaimana untuk mensirikan objek di Jawa, mereka tidak biasa dengan mana-mana contoh serialisasi dan tidak dapat menjelaskan mekanik kerjanya, perbezaan antara pembolehubah sementara dan tidak menentu, mereka tidak tahu berapa banyak kaedah antara muka Serializable mempunyai. Apakah antara muka penanda? Apakah tujuannya? Apakah perbezaan antara pelaksanaan Externalizable dan Serializable di Jawa? Mengapa java tidak menggantikan Serializable dengan @Serializable selepas memperkenalkan anotasi? Dalam artikel ini, kami akan membincangkan soalan untuk pembangun pemula dan lanjutan, yang boleh sama-sama berguna untuk semua orang: daripada pembangun junior hingga senior. Kebanyakan projek komersil menggunakan sama ada pangkalan data, fail dipetakan memori , atau hanya fail rata biasa untuk memberikan keteguhan yang lebih besar, tetapi hanya sedikit yang bergantung pada proses bersiri Java. Walau apa pun, siaran ini bukan tutorial - ia lebih kepada soalan yang patut dijelaskan sendiri sebelum pergi ke mana-mana temu duga Java dan terkejut dengan istilah yang tidak diketahui oleh anda sendiri. Bagi mereka yang tidak biasa dengan pensirilan Java sama sekali: “Pensirian dalam Java ialah satu proses yang digunakan untuk mensirikan objek di Jawa dengan menyimpan keadaan objek dalam fail dengan sambungan .ser dan mencipta semula keadaan objek daripada fail ini. Proses terbalik ini dipanggil penyahserialisasian. sepulka Java Serialization API menyediakan pembangun dengan mekanisme standard untuk menyerikan objek menggunakan antara muka Serializable dan Externalizable. Ngomong-ngomong, artikel ini adalah kesinambungan daripada artikel saya ( bukan saya, penterjemah, tetapi pengarang asal Inggeris) artikel sebelumnya: 20 soalan temu bual mengenai corak reka bentuk dan 10 soalan temu bual mengenai corak Singleton di Jawa . Jadi, mari pergi! Apakah bersiri dalam Java? Pensirian objek dalam Java ialah proses yang digunakan untuk menukar objek kepada format binari yang boleh disimpan ke cakera atau dihantar melalui rangkaian ke mana-mana mesin maya Java lain yang sedang berjalan; proses terbalik untuk mencipta objek daripada aliran binari dipanggil penyahserialisasian. Java menyediakan API yang merangkumi java.io.Serializable, java.io.Externalizable, ObjectInputStream dan ObjectOutputStream dsb. Pengaturcara bebas menggunakan mekanisme bersiri lalai yang Java gunakan berdasarkan struktur kelas, tetapi mereka juga boleh menggunakan format binari tersuai mereka sendiri, yang sering disyorkan sebagai amalan terbaik bersiri kerana format binari bersiri menjadi sebahagian daripada API yang dieksport kelas dan berpotensi memecahkan enkapsulasi dalam Java yang disediakan oleh medan peribadi dan pakej-peribadi . Secara umum, maklumat ini akan cukup untuk bermula. Bagaimana untuk membuat kelas Java boleh bersiri? Ia sangat mudah. Kelas anda hanya perlu melaksanakan antara muka java.io.Serializable dan JVM akan menguruskan mensiri objek dalam format lalai. Keputusan untuk mencipta kelas boleh bersiri harus dibuat secara ringkas kerana, walaupun kos jangka pendek untuk mencipta kelas boleh bersiri adalah rendah, kos jangka panjang adalah penting dan berkemungkinan mengehadkan keupayaan anda untuk membuat pengubahsuaian selanjutnya pada pelaksanaan. Ini berlaku kerana, seperti mana-mana API awam, bentuk bersiri objek menjadi sebahagian daripada API awam dan apabila anda menukar struktur kelas anda dengan melaksanakan antara muka tambah, menambah atau mengalih keluar mana-mana medan berpotensi memecahkan siri lalai. Walau bagaimanapun, ini boleh diminimumkan dengan menggunakan format binari tersuai, tetapi ia masih memerlukan banyak usaha untuk memastikan keserasian ke belakang. Satu contoh cara penyirian boleh mengehadkan keupayaan anda untuk mengubah suai kelas ialah medan SerialVersionUID. Jika anda tidak mengisytiharkan SerialVersionUID secara eksplisit, maka mesin maya menjananya berdasarkan struktur kelas, yang bergantung pada antara muka yang dilaksanakan oleh kelas dan beberapa faktor lain yang boleh diubah. Katakan anda melaksanakan antara muka yang berbeza berbanding JVM, yang akan menjana SerialVersionUID yang berbeza untuk versi baharu fail kelas, dan apabila anda cuba memuatkan objek lama yang disiri oleh versi lama program anda, anda akan mendapat InvalidClassException. Soalan 1) Apakah perbezaan antara antara muka Serializable dan Externalizable dalam Java? Ini adalah soalan wawancara bersiri Java yang paling kerap ditanya. Antara muka Externalizable membekalkan kami kaedah writeExternal() dan readExternal(), yang memberi kami fleksibiliti untuk mengawal serialisasi dan bukannya bergantung pada mekanisme lalai. Pelaksanaan yang betul bagi antara muka Externalizable boleh meningkatkan prestasi aplikasi dengan ketara. Soalan 2) Berapa banyak kaedah yang ada pada Serializable? Jika tiada kaedah, maka apakah tujuan antara muka Serializable? Antara muka boleh bersiri wujud dalam pakej java.io dan membentuk teras enjin bersiri Java. Ia tidak mempunyai sebarang kaedah dan juga dipanggil antara muka penanda dalam Java. Apabila kelas anda melaksanakan antara muka java.io.Serializable, ia menjadi boleh bersiri. Mudah sahaja. Soalan 3) Apakah serialVersionUID? Apa yang berlaku jika anda tidak mentakrifkannya? Salah satu soalan wawancara bersiri Java kegemaran saya. SerialVersionUID ialah pengecam yang diletakkan pada objek apabila ia bersiri, biasanya kod cincang objek. Anda boleh menggunakan alat serialver untuk mendapatkan serialVersionUID bagi objek bersiri. SerialVersionUID digunakan untuk kawalan versi objek. Anda juga boleh menentukan serialVersionUID dalam fail kelas anda secara manual. Akibat daripada tidak menyatakan serialVersionUID ialah jika anda menambah atau menukar mana-mana medan dalam kelas, kelas yang sudah bersiri tidak akan dapat pulih kerana serialVersionUID yang dijana untuk kelas baharu akan berbeza daripada medan yang sama bagi objek bersiri lama. Proses bersiri Java bergantung pada serialVersionUID yang betul untuk memulihkan keadaan objek bersiri dan membuang java.io.InvalidClassException jika terdapat ketidakpadanan. Untuk mengetahui lebih lanjut mengenai serialversionuid, lihat di sini . Soalan 4) Apabila bersiri, adakah anda mahu beberapa ahli tidak bersiri? Bagaimana untuk mencapai ini? Satu lagi soalan wawancara bersiri yang kerap ditanya. Kadangkala orang juga bertanya bagaimana pembolehubah sementara digunakan, sama ada pembolehubah sementara dan statik bersiri atau tidak, dsb., jadi jika anda tidak mahu sebarang medan menjadi sebahagian daripada keadaan objek, isytiharkannya sebagai statik atau bergantung sementara pada keperluan anda, dan ia tidak akan disertakan dalam proses penyiaran Java. Soalan 5) Apakah yang berlaku jika salah seorang daripada ahli kelas tidak melaksanakan antara muka Serializable? Salah satu soalan mudah tentang proses bersiri dalam Java. Jika anda cuba mensirikan objek kelas yang melaksanakan Serializable, tetapi objek itu termasuk rujukan kepada kelas yang tidak Serializable, maka NotSerializableException akan dilemparkan semasa runtime, dan itulah sebabnya saya sentiasa meletakkan SerializableAlert (bahagian komen dalam saya kod), salah satu teknik mengulas kod terbaik ialah mengarahkan pembangun mengingati fakta ini apabila menambah medan baharu pada kelas Serializable. Soalan 6) Jika kelas boleh bersiri tetapi kelas supernya tidak, apakah keadaan pembolehubah contoh yang diwarisi daripada kelas super selepas penyahserialisasian? Proses bersiri Java hanya diteruskan dalam hierarki objek selagi kelas melaksanakan antara muka Serializable dan nilai pembolehubah yang diwarisi daripada superclass akan dimulakan dengan memanggil pembina superclass yang tidak boleh bersiri semasa proses penyahserilan. Sebaik sahaja rantai pembina dimulakan, tiada cara untuk menghentikannya, jadi walaupun kelas yang lebih tinggi dalam hierarki (jangan) melaksanakan antara muka Serializable , pembina akan dilaksanakan. Soalan wawancara bersiri ini mungkin kelihatan sangat sukar, tetapi jika anda sudah biasa dengan konsep utama, ia tidak akan menjadi sukar. Soalan 7) Bolehkah anda menyesuaikan proses bersiri atau mengatasi proses bersiri lalai dalam Java? Jawapannya ya, boleh. Kita semua tahu bahawa untuk mensirikan objek, ObjectOutputStream.writeObject(saveThisObject) dipanggil dan untuk membaca objek, ObjectInputStream.readObject() dipanggil, tetapi terdapat satu lagi perkara yang disediakan oleh Mesin Maya Java kepada anda - mentakrifkan kedua-dua kaedah ini dalam kelas anda. Jika anda mentakrifkannya dalam kelas anda, JVM akan memanggil kedua-dua kaedah ini dan bukannya menggunakan mekanisme siri lalai. Di sini anda boleh mengkonfigurasi kelakuan bersiri dan penyahsirilan objek dengan melakukan sebarang tugas prapemprosesan atau pasca pemprosesan. Adalah penting untuk ambil perhatian bahawa kaedah ini mestilah tertutup untuk mengelakkan pewarisan, mengatasi atau lebihan beban. Memandangkan hanya Mesin Maya Java boleh memanggil kaedah persendirian, integriti kelas anda akan dipelihara dan penyirian akan berfungsi seperti biasa. Pada pendapat saya, ini adalah salah satu soalan terbaik yang boleh ditanya dalam mana-mana temuduga Java Serialization. Soalan susulan yang baik ialah: mengapa anda perlu menyediakan borang bersiri tersuai untuk objek anda? Soalan 8) Katakan superclass kelas baharu melaksanakan antara muka Serializable, bagaimanakah kita boleh mengelak daripada bersiri kelas baharu? Salah satu soalan temu bual yang sukar mengenai Serialisasi di Jawa. Jika kelas super kelas sudah melaksanakan antara muka Serializable dalam Java, maka kelas turunan juga boleh Serializable, kerana anda tidak boleh tidak melaksanakan antara muka induk, dan tidak mungkin untuk menjadikannya kelas Non Serializable. Walau bagaimanapun, terdapat cara untuk mengelakkan penyirian untuk kelas baharu ini. Untuk melakukan ini, anda perlu melaksanakan kaedah writeObject() dan readObject() dan membuang NotSerializableException daripada kaedah ini. Soalan ini biasanya ditanya sebagai soalan tambahan semasa temuduga berlangsung. Soalan 9) Apakah kaedah yang digunakan dalam proses bersiri dan penyahserikatan di Jawa? Ini adalah soalan yang sangat biasa dalam bersiri. Apakah yang cuba dicari oleh penemuduga dalam kes ini? Sama ada anda biasa dengan penggunaan readObject(), writeObject(), readExternal() dan writeExternal() atau tidak. Siri Java dilakukan oleh kelas java.io.ObjectOutputStream. Kelas ini ialah strim yang ditapis yang dililitkan pada strim bait tahap yang lebih rendah untuk mengendalikan enjin siri. Untuk menyimpan sebarang objek menggunakan mekanisme bersiri, kami memanggil ObjectOutputStream.writeObject(saveThisObject) dan untuk menyahsiri objek itu, kami memanggil kaedah ObjectInputStream.readObject(). Memanggil kaedah writeObject() memulakan proses bersiri. Satu perkara penting yang perlu diberi perhatian tentang kaedah readObject() ialah ia digunakan untuk membaca bait dan mencipta serta mengembalikan objek daripada bait tersebut, yang seterusnya mesti dihantar ke jenis yang betul. Soalan 10) Katakan anda mempunyai kelas yang telah anda sirikan dan simpan, dan kemudian anda mengubah suai kelas itu untuk menambah medan baharu. Apakah yang berlaku jika anda menyahsiri objek yang sudah bersiri? Ia bergantung kepada sama ada kelas itu mempunyai serialVersionUID sendiri atau tidak. Seperti yang kita ketahui daripada soalan di atas, jika kami tidak menyediakan serialVersionUID dalam kod kami, pengkompil java akan menjananya sendiri dan biasanya ia akan sama dengan kod cincang objek itu. Selepas menambah mana-mana medan baharu, terdapat kemungkinan serialVersionUID baharu yang dijana untuk versi kelas itu tidak sepadan dengan objek yang telah bersiri, dalam hal ini API akan membuang java.io.InvalidClassException. Atas sebab ini, adalah disyorkan untuk mempunyai serialVersionUID anda sendiri dalam kod anda, yang sentiasa sama untuk kelas yang sama. Soalan 11) Apakah perubahan yang serasi dan tidak serasi dalam mekanisme siri Java? Masalah sebenar ialah mengubah struktur kelas dengan menambah sebarang medan, kaedah atau mengalih keluar mana-mana medan atau kaedah dengan objek yang sudah bersiri. Menurut spesifikasi Java Serialization, menambah sebarang medan atau kaedah berada di bawah perubahan dan perubahan yang serasi. hierarki kelas atau antara muka Serializable yang melaksanakan PBB beberapa di bawah perubahan yang tidak serasi). Untuk senarai lengkap perubahan yang serasi dan tidak serasi, saya cadangkan membaca Spesifikasi Pensirian Java. Soalan 12) Bolehkah kita memindahkan objek bersiri melalui rangkaian? Ya, anda boleh menghantar objek bersiri melalui rangkaian kerana objek bersiri Java ialah koleksi bait yang boleh dihantar dalam apa jua cara. Anda juga boleh menyimpan objek bersiri pada cakera atau dalam pangkalan data sebagai Blob. Soalan 13) Apakah jenis pembolehubah yang tidak bersiri semasa bersiri Java? Soalan ini kadangkala ditanya secara berbeza, tetapi matlamatnya adalah sama: untuk mengetahui sama ada pembangun Java mengetahui spesifikasi pembolehubah statik dan sementara bersiri. Memandangkan pembolehubah statik tergolong dalam kelas dan bukan objek, ia bukan sebahagian daripada keadaan objek, jadi ia tidak berterusan semasa proses bersiri Java. Oleh kerana penyirian Java hanya menyimpan keadaan objek dan bukan objek itu sendiri, pembolehubah sementara juga tidak termasuk dalam proses bersiri dan bukan sebahagian daripada keadaan bersiri objek. Selepas soalan ini, mungkin penemuduga akan bertanya: Jika anda tidak menyimpan nilai pembolehubah ini, maka apakah nilai pembolehubah ini selepas deserialisasi dan mencipta semula objek ini? Dan ini, rakan sekerja, fikir sendiri :) Artikel asal ada di sini .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION