JavaRush /Blog Java /Random-MS /Mengapa menggunakan SerialVersionUID dalam kelas Serializ...
0xFF
Tahap
Донецк

Mengapa menggunakan SerialVersionUID dalam kelas Serializable di Java

Diterbitkan dalam kumpulan
Serializationdan SerialVersionUIDsentiasa menjadi misteri kepada banyak pembangun Java. Saya sering melihat soalan tentang apakah SerialVersionUID, atau apa yang berlaku jika saya tidak mengisytiharkan SerialVersionUIDdalam -kelas saya Serializable? Mengapa menggunakan SerialVersionUID dalam kelas Serializable dalam Java - 1Selain daripada mengelirukan dan jarang digunakan, sebab lain untuk soalan ini ialah amaran hilang Eclipse IDE , SerialVersionUIDsebagai contoh: " Pelanggan kelas Serializable tidak mengisytiharkan medan SerialVersionUID akhir statikSerializable jenis panjang " Dalam artikel ini, anda bukan sahaja akan mempelajari asas-asas Java tetapi juga kesannya terhadap proses penyiaran dan penyahsiran. Apabila anda mengisytiharkan kelas, seperti dengan melaksanakan antara muka token , masa jalan Java menyimpan contoh kelas tersebut pada cakera menggunakan mekanisme pensirilan lalai melainkan anda mengkonfigurasi proses untuk menggunakan antara muka Externalizable . Semasa bersiri, masa jalan Java mencipta nombor versi untuk kelas supaya ia boleh menyahsirikannya kemudian. Di Java, nombor versi ini dikenali sebagai . Jika, semasa penyahserikatan, tiada padanan, maka proses akan keluar dengan pengecualian dalam aliran " " , dan juga akan mencetak nama kelas dan yang sepadan . Penyelesaian pantas untuk menyelesaikan masalah ini ialah dengan menyalin dan mentakrifkannya sebagai pemalar jenis dalam kelas anda. Dalam artikel ini, kita akan belajar tentang sebab kita harus menggunakan dalam Java dan cara menggunakan alat JDK bersiri untuk menjana ID ini. Jika anda baru dalam penyiaran, anda juga boleh menonton 10 Soalan Temuduga Pensirian Java Terbaik untuk menilai pengetahuan anda dan mencari jurang dalam pemahaman anda untuk bacaan lanjut. Seperti (concurrency) dan (multithreading), (serialisasi) ialah topik lain yang patut dibaca beberapa kali. CustomerSerialVersionUIDSerialVersionUIDSerializablejava.io.SerializableSerialVersionUIDSerialVersionUIDInvalidClassExceptionmainjava.io.InvalidClassExceptionSerialVersionUIDSerialVersionUIDprivate static final longSerialVersionUIDConcurrencyMulti-threadingSerialization

Mengapa menggunakan SerialVersionUID dalam Java

Seperti yang saya katakan, apabila kita belum mentakrifkan nilai SerialVersionUIDseperti static final longdalam kelas kita, mekanisme bersiri akan melakukannya untuk kita. Mekanisme ini sensitif kepada banyak butiran, termasuk medan kelas anda, pengubah aksesnya, antara muka yang dilaksanakannya, dan juga pelaksanaan pengkompil yang berbeza; sebarang perubahan pada kelas atau penggunaan pengkompil yang berbeza mungkin menghasilkan hasil yang berbeza, SerialVersionUIDyang akhirnya akan hentikan data bersiri daripada dimuat semula. Adalah berisiko untuk bergantung pada mekanisme bersiri Java untuk menjana id ini, itulah sebabnya idea yang baik untuk mentakrifkannya secara eksplisit dalam kelas SerializableSerialVersionUID anda . Saya sangat mengesyorkan membaca Java klasik - Joshua Bloch "Jawa Berkesan" untuk memahami pensirilan Java dan masalah mengendalikannya secara tidak betul. Dengan cara ini, JDK juga menyediakan alat , terletak dalam direktori bin direktori JAVA_HOME , pada komputer saya, C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , yang boleh digunakan untuk menjana untuk kelas lama. Ini sangat berguna sekiranya anda telah membuat perubahan pada kelas anda yang memecahkan pensirilan dan aplikasi anda tidak dapat memuatkan semula kejadian bersiri. Anda boleh menggunakan utiliti ini dengan mudah untuk mencipta contoh lama, dan kemudian menggunakannya secara eksplisit dengan mengisytiharkan medan sebagai peribadi statik akhir panjang . Ngomong-ngomong, sangat disyorkan atas sebab prestasi dan keselamatan untuk menggunakan format binari biasa untuk bersiri; sekali lagi, "Java Berkesan" mempunyai beberapa perenggan yang menunjukkan kelebihan format biasa dengan terperinci. serialverSerialVersionUIDSerialVersionUID SerialVersionUID

Cara menggunakan utiliti JDK serialver untuk menjana SerialVersionUID

Anda boleh gunakan serialveruntuk menjana SerialVersionUIDkelas. Ini amat berguna untuk membangunkan kelas; utiliti itu kembali SerialVersionUIDdalam format yang mudah untuk disalin. Anda boleh menggunakan serialverutiliti JDK seperti yang ditunjukkan dalam contoh:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Anda juga boleh menggunakan utiliti serialversebagai GUIarahan $ serialver –show, ini akan membuka pemeriksa serial versionyang mengambil nama kelas penuh dan memaparkannya Serial version.

Ringkasan

Sekarang kita tahu apa itu SerialVersionUIDdan mengapa penting untuk mengisytiharkannya dalam Serializablekelas, sudah tiba masanya untuk menyemak beberapa fakta penting yang berkaitan dengan Java SerialVersionUID.
  1. SerialVersionUIDdigunakan untuk menunjukkan versi data bersiri.

  2. Apabila kami tidak mengisytiharkan SerialVersionUIDdalam kelas kami, masa jalan Java melakukannya untuk kami, tetapi proses ini sensitif kepada banyak metadata kelas termasuk bilangan medan, jenis medan, pengubah akses medan, antara muka yang dilaksanakan dalam kelas , dsb. Anda boleh mendapatkan maklumat yang tepat dalam dokumentasi Serialisasi daripada Oracle.

  3. Adalah disyorkan untuk mengisytiharkan SerialVersionUID sebagai pembolehubah panjang akhir statik peribadi untuk mengelakkan mekanisme lalai. Sesetengah IDE, seperti Eclipse , juga mengeluarkan amaran jika anda terlupa ini, contohnya: "Pelanggan kelas Serializable tidak mengisytiharkan medan SerialVersionUID akhir statik jenis panjang." . Walaupun anda boleh melumpuhkan amaran ini dengan pergi ke Tetingkap > Keutamaan > Java > Pengkompil > Ralat/Amaran > Masalah Pengaturcaraan Berpotensi, saya cadangkan jangan berbuat demikian. Hanya apabila pemulihan data tidak diperlukan, saya boleh cuai mengenainya. Inilah rupa ralat ini dalam Eclipse IDE, anda hanya perlu membuat keputusan pantas yang pertama. Mengapa menggunakan SerialVersionUID dalam kelas Serializable di Java - 2

  4. Anda juga boleh menggunakan utiliti serialver daripada JDK untuk menjana Versi Serial untuk kelas dalam Java. Utiliti juga mempunyai GUI, yang didayakan apabila lulus parameter - show.

  5. Amalan terbaik dalam penyirian adalah dengan mengisytiharkan secara eksplisit SerialVersionUID, untuk mengelakkan sebarang masalah dengan penyahsiran, terutamanya jika anda bekerja dengan aplikasi pelayan pelanggan yang bergantung pada data bersiri, seperti RMI.
Ini semua tentang SerialVersionUIDdi Jawa. Sekarang kita tahu mengapa penting untuk mengisytiharkan dengan betul SerialVersionUIDdi dalam kelas. Anda boleh mengucapkan terima kasih kepada IDE anda untuk peringatan ini, yang mungkin boleh memecahkan penyahsirian kelas anda. Jika anda ingin membaca lebih lanjut mengenai siri dan konsep yang berkaitan, anda juga boleh menyemak artikel hebat ini. Asal di sini
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION