serialVersionUID
memfasilitasi versi data serial. Nilainya disimpan dengan data saat membuat serial. Saat menghapus serialisasi, versi yang sama diperiksa untuk melihat bagaimana data bersambung cocok dengan kode saat ini.
Jika Anda ingin versi data Anda, Anda biasanya mulai dengan serialVersionUID
0, dan menabraknya dengan setiap perubahan struktural ke kelas Anda yang mengubah data serial (menambah atau menghapus bidang non-transien).
Mekanisme de-serialisasi bawaan ( in.defaultReadObject()
) akan menolak untuk menghilangkan serial dari data versi lama. Tetapi jika Anda mau, Anda dapat mendefinisikan readObject Anda sendiri () fungsi yang dapat membaca kembali data lama. Kode khusus ini kemudian dapat memeriksa serialVersionUID
untuk mengetahui versi data yang ada dan memutuskan bagaimana untuk menghilangkan urutannya. Teknik versi ini berguna jika Anda menyimpan data bersambung yang bertahan beberapa versi kode Anda.
Tetapi menyimpan data serial untuk rentang waktu yang lama tidak terlalu umum. Adalah jauh lebih umum untuk menggunakan mekanisme serialisasi untuk secara sementara menulis data misalnya cache atau mengirimkannya melalui jaringan ke program lain dengan versi yang sama dari bagian-bagian yang relevan dari basis kode.
Dalam hal ini Anda tidak tertarik mempertahankan kompatibilitas ke belakang. Anda hanya peduli untuk memastikan bahwa basis kode yang berkomunikasi memang memiliki versi yang sama dari kelas yang relevan. Untuk memfasilitasi pemeriksaan semacam itu, Anda harus mempertahankanserialVersionUID
seperti sebelumnya dan jangan lupa untuk memperbaruinya saat membuat perubahan pada kelas Anda.
Jika Anda lupa memperbarui bidang, Anda mungkin berakhir dengan dua versi berbeda dari kelas dengan struktur yang berbeda tetapi dengan yang sama serialVersionUID
. Jika ini terjadi, mekanisme default (in.defaultReadObject()
) tidak akan mendeteksi perbedaan, dan mencoba untuk menderialisasi data yang tidak kompatibel. Sekarang Anda mungkin berakhir dengan kesalahan runtime kriptik atau kegagalan diam (bidang nol). Jenis kesalahan ini mungkin sulit ditemukan.
Jadi untuk membantu usecase ini, platform Java menawarkan Anda pilihan untuk tidak mengatur serialVersionUID
secara manual. Sebagai gantinya, hash dari struktur kelas akan dihasilkan pada waktu kompilasi dan digunakan sebagai id. Mekanisme ini akan memastikan bahwa Anda tidak pernah memiliki struktur kelas yang berbeda dengan id yang sama, sehingga Anda tidak akan mendapatkan kegagalan serialisasi runtime yang sulit dilacak yang disebutkan di atas.
Tetapi ada bagian belakang dari strategi id yang dibuat secara otomatis. Yaitu bahwa id yang dihasilkan untuk kelas yang sama mungkin berbeda di antara kompiler (seperti yang disebutkan oleh Jon Skeet di atas). Jadi, jika Anda mengkomunikasikan data serial antara kode yang dikompilasi dengan kompiler yang berbeda, disarankan untuk mempertahankan id secara manual.
Dan jika Anda kompatibel dengan data Anda seperti dalam kasus penggunaan pertama yang disebutkan, Anda juga mungkin ingin mempertahankan id sendiri. Ini untuk mendapatkan id yang dapat dibaca dan memiliki kontrol yang lebih besar tentang kapan dan bagaimana mereka berubah.