JavaRush /Java Blog /Random-ID /Mengapa menggunakan SerialVersionUID di dalam kelas Seria...
0xFF
Level 9
Донецк

Mengapa menggunakan SerialVersionUID di dalam kelas Serializable di Java

Dipublikasikan di grup Random-ID
Serializationdan SerialVersionUIDselalu menjadi misteri bagi banyak pengembang Java. Saya sering melihat pertanyaan tentang apa itu SerialVersionUID, atau apa yang terjadi jika saya tidak mendeklarasikannya SerialVersionUIDdi Serializable-kelas saya? Mengapa menggunakan SerialVersionUID di dalam kelas Serializable di Java - 1Selain membingungkan dan jarang digunakan, alasan lain untuk pertanyaan ini adalah hilangnya peringatan Eclipse IDE , SerialVersionUIDmisalnya: " Pelanggan kelas Serializable tidak mendeklarasikan bidang SerialVersionUID akhir statisSerializable bertipe panjang " Pada artikel ini, Anda tidak hanya akan mempelajari dasar-dasar Java tetapi juga dampaknya terhadap proses serialisasi dan de-serialisasi. Saat Anda mendeklarasikan suatu kelas, seperti dengan mengimplementasikan antarmuka token , runtime Java menyimpan instance kelas tersebut pada disk menggunakan mekanisme serialisasi default kecuali Anda mengonfigurasi proses untuk menggunakan antarmuka Externalizable . Selama serialisasi, runtime Java membuat nomor versi untuk kelas tersebut sehingga dapat melakukan deserialisasi nanti. Di Java, nomor versi ini dikenal sebagai . Jika selama deserialisasi tidak ada kecocokan, maka proses akan keluar dengan pengecualian di aliran " " , dan juga akan mencetak nama kelas dan yang sesuai . Solusi cepat untuk memperbaiki masalah ini adalah dengan menyalin dan mendefinisikannya sebagai konstanta tipe di kelas Anda. Pada artikel ini, kita akan mempelajari mengapa kita harus menggunakan Java dan cara menggunakan alat serialver JDK untuk menghasilkan ID ini. Jika Anda baru mengenal serialisasi, Anda juga dapat menonton 10 Pertanyaan Wawancara Serialisasi Java Teratas untuk menilai pengetahuan Anda dan menemukan kesenjangan dalam pemahaman Anda untuk bacaan lebih lanjut. Suka (konkurensi) dan (multithreading), (serialisasi) adalah topik lain yang patut dibaca beberapa kali. CustomerSerialVersionUIDSerialVersionUIDSerializablejava.io.SerializableSerialVersionUIDSerialVersionUIDInvalidClassExceptionmainjava.io.InvalidClassExceptionSerialVersionUIDSerialVersionUIDprivate static final longSerialVersionUIDConcurrencyMulti-threadingSerialization

Mengapa menggunakan SerialVersionUID di Java

Seperti yang saya katakan, ketika kita belum mendefinisikan nilai SerialVersionUIDseperti static final longdi kelas kita, mekanisme serialisasi akan melakukannya untuk kita. Mekanisme ini sensitif terhadap banyak detail, termasuk bidang kelas Anda, pengubah aksesnya, antarmuka yang diimplementasikannya, dan bahkan implementasi kompiler yang berbeda; setiap perubahan pada kelas atau penggunaan kompiler yang berbeda dapat menghasilkan hasil yang berbeda, SerialVersionUIDyang pada akhirnya akan menghasilkan hasil yang berbeda. hentikan pemuatan ulang data serial. Mengandalkan mekanisme serialisasi Java untuk menghasilkan id ini berisiko, oleh karena itu sebaiknya definisikan secara eksplisit SerialVersionUIDdi kelas Serializable Anda . Saya sangat merekomendasikan membaca Java klasik - Joshua Bloch “Effective Java” untuk memahami serialisasi Java dan masalah penanganannya yang salah. Omong-omong, JDK juga menyediakan alat serialver, yang terletak di direktori bin dari direktori JAVA_HOME , di komputer saya, C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , yang dapat digunakan untuk menghasilkan SerialVersionUIDuntuk kelas lama. Ini sangat berguna jika Anda telah membuat perubahan pada kelas Anda yang merusak serialisasi dan aplikasi Anda tidak dapat memuat ulang instance serial. Anda dapat dengan mudah menggunakan utilitas ini untuk membuat SerialVersionUIDinstance lama, dan kemudian menggunakannya secara eksplisit dengan mendeklarasikan bidang tersebut sebagai private static final long SerialVersionUID . Omong-omong, sangat disarankan untuk alasan kinerja dan keamanan menggunakan format biner biasa untuk serialisasi; sekali lagi, "Java Efektif" memiliki beberapa paragraf yang menunjukkan keunggulan format biasa dengan sangat rinci.

Cara menggunakan utilitas serialver JDK untuk menghasilkan SerialVersionUID

Anda dapat menggunakannya serialveruntuk menghasilkan SerialVersionUIDkelas. Hal ini sangat berguna untuk mengembangkan kelas; utilitas ini kembali SerialVersionUIDdalam format yang mudah disalin. Anda dapat menggunakan serialverutilitas JDK seperti yang ditunjukkan pada 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 dapat menggunakan utilitas ini serialversebagai GUIperintah $ serialver –show, ini akan membuka inspektur serial versionyang mengambil nama kelas lengkap dan menampilkannya Serial version.

Ringkasan

Sekarang kita sudah tahu apa itu SerialVersionUIDdan mengapa penting untuk mendeklarasikannya di kelas Serializable-, saatnya mengulas beberapa fakta penting terkait Java SerialVersionUID.
  1. SerialVersionUIDdigunakan untuk menunjukkan versi data serial.

  2. Ketika kita tidak mendeklarasikan SerialVersionUIDkelas kita, runtime Java yang melakukannya untuk kita, namun proses ini sensitif terhadap banyak metadata kelas termasuk jumlah bidang, jenis bidang, pengubah akses bidang, antarmuka yang diimplementasikan di kelas. , dll. Anda dapat menemukan informasi persisnya di dokumentasi Serialisasi dari Oracle.

  3. Disarankan untuk mendeklarasikan SerialVersionUID sebagai variabel panjang final statis pribadi untuk menghindari mekanisme default. Beberapa IDE, seperti Eclipse , juga mengeluarkan peringatan jika Anda lupa, misalnya: "Pelanggan kelas Serializable tidak mendeklarasikan bidang SerialVersionUID akhir statis bertipe panjang." . Meskipun Anda dapat menonaktifkan peringatan ini dengan membuka Window > Preferences > Java > Compiler > Errors/Warnings > Potensi Masalah Pemrograman, saya sarankan untuk tidak melakukannya. Hanya ketika pemulihan data tidak diperlukan, saya bisa ceroboh. Seperti inilah tampilan kesalahan ini di IDE Eclipse, yang perlu Anda lakukan hanyalah membuat keputusan cepat pertama. Mengapa menggunakan SerialVersionUID di dalam kelas Serializable di Java - 2

  4. Anda juga dapat menggunakan utilitas serialver dari JDK untuk menghasilkan Versi Serial untuk kelas di Java. Utilitas ini juga memiliki GUI, yang diaktifkan ketika meneruskan parameter - show.

  5. Praktik terbaik dalam serialisasi adalah mendeklarasikan secara eksplisit SerialVersionUID, untuk menghindari masalah de-serialisasi, terutama jika Anda bekerja dengan aplikasi server-klien yang mengandalkan data serial, seperti RMI.
Semuanya ada SerialVersionUIDdi Jawa. Sekarang kita tahu mengapa penting untuk mendeklarasikan dengan benar SerialVersionUIDdi kelas. Anda dapat berterima kasih kepada IDE Anda atas pengingat ini, yang berpotensi menghentikan de-serialisasi kelas Anda. Jika Anda ingin membaca lebih lanjut tentang serialisasi dan konsep terkait, Anda juga dapat membaca artikel luar biasa ini. Asli di sini
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION