Serialization
dan
SerialVersionUID
sentiasa menjadi misteri kepada banyak pembangun Java. Saya sering melihat soalan tentang apakah
SerialVersionUID
, atau apa yang berlaku jika saya tidak mengisytiharkan
SerialVersionUID
dalam -kelas saya
Serializable
?
Selain daripada mengelirukan dan jarang digunakan, sebab lain untuk soalan ini ialah amaran hilang Eclipse IDE ,
SerialVersionUID
sebagai 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.
Customer
SerialVersionUID
SerialVersionUID
Serializable
java.io.Serializable
SerialVersionUID
SerialVersionUID
InvalidClassException
main
java.io.InvalidClassException
SerialVersionUID
SerialVersionUID
private
static
final
long
SerialVersionUID
Concurrency
Multi-threading
Serialization
Mengapa menggunakan SerialVersionUID dalam Java
Seperti yang saya katakan, apabila kita belum mentakrifkan nilai
SerialVersionUID
seperti
static
final
long
dalam 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,
SerialVersionUID
yang 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.
serialver
SerialVersionUID
SerialVersionUID
SerialVersionUID
Cara menggunakan utiliti JDK serialver untuk menjana SerialVersionUID
Anda boleh gunakan
serialver
untuk menjana
SerialVersionUID
kelas. Ini amat berguna untuk membangunkan kelas; utiliti itu kembali
SerialVersionUID
dalam format yang mudah untuk disalin. Anda boleh menggunakan
serialver
utiliti 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
serialver
sebagai
GUI
arahan
$ serialver –show
, ini akan membuka pemeriksa
serial version
yang mengambil nama kelas penuh dan memaparkannya
Serial version
.
Ringkasan
Sekarang kita tahu apa itu
SerialVersionUID
dan mengapa penting untuk mengisytiharkannya dalam
Serializable
kelas, sudah tiba masanya untuk menyemak beberapa fakta penting yang berkaitan dengan Java SerialVersionUID.
SerialVersionUID
digunakan untuk menunjukkan versi data bersiri.
- Apabila kami tidak mengisytiharkan
SerialVersionUID
dalam 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.
- 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.
- 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
.
- 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
SerialVersionUID
di Jawa. Sekarang kita tahu mengapa penting untuk mengisytiharkan dengan betul
SerialVersionUID
di 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
GO TO FULL VERSION