apa yang menyebabkan masalah deserialisasi?
Saya ingin memberi Anda sedikit latar belakang sebelum menjawab pertanyaan Anda,
Serialisasi runtime mengasosiasikan dengan setiap kelas serializable nomor versi, yang disebut serialVersionUID, yang digunakan selama deserialisasi untuk memverifikasi bahwa pengirim dan penerima objek serial telah memuat kelas untuk objek yang kompatibel sehubungan dengan serialisasi. Jika penerima telah memuat kelas untuk objek yang memiliki serialVersionUID berbeda dari kelas pengirim yang sesuai, maka deserialisasi akan menghasilkan InvalidClassException.
Jika kelas serializable tidak secara eksplisit mendeklarasikan serialVersionUID, maka runtime serialisasi akan menghitung nilai serialVersionUID default untuk kelas tersebut berdasarkan berbagai aspek kelas, Ini menggunakan informasi kelas berikut untuk menghitung SerialVersionUID,
- Nama kelas.
- Pengubah kelas ditulis sebagai bilangan bulat 32-bit.
- Nama setiap antarmuka diurutkan berdasarkan nama.
- Untuk setiap bidang kelas yang diurutkan berdasarkan nama bidang (kecuali bidang statis pribadi dan sementara pribadi:
- Nama bidang.
- Pengubah bidang ditulis sebagai bilangan bulat 32-bit.
- Deskriptor bidang.
-
jika penginisialisasi kelas ada, tuliskan yang berikut:
Nama metode, .
Pengubah metode, java.lang.reflect.Modifier.STATIC, ditulis sebagai bilangan bulat 32-bit.
Deskripsi metode, ()V.
-
Untuk setiap konstruktor non-pribadi yang diurutkan berdasarkan nama metode dan tanda tangan:
Nama metode, .
Pengubah metode ditulis sebagai bilangan bulat 32-bit.
Deskripsi metode.
-
Untuk setiap metode non-pribadi yang diurutkan berdasarkan nama metode dan tanda tangan:
Nama metodenya.
Pengubah metode ditulis sebagai bilangan bulat 32-bit.
Deskripsi metode.
Jadi, untuk menjawab pertanyaan Anda,
Apakah penghapusan properti publik/pribadi menyebabkan masalah? Menambahkan properti baru, mungkin? Apakah menambahkan fungsi baru ke kelas akan menimbulkan masalah? Bagaimana dengan lebih banyak konstruktor?
Ya, semua penambahan/penghapusan ini secara default akan menyebabkan masalah.
Tetapi satu cara untuk mengatasinya adalah dengan mendefinisikan SerialVersionUID secara eksplisit, ini akan memberi tahu sistem serialisasi bahwa saya tahu kelas akan berevolusi (atau berevolusi) dari waktu ke waktu dan jangan membuat kesalahan. Jadi sistem de-serialisasi hanya membaca bidang-bidang yang ada di kedua sisi dan memberikan nilainya. Bidang yang baru ditambahkan di sisi de-serialisasi akan mendapatkan nilai default. Jika beberapa bidang dihapus di sisi de-serialisasi, algoritme hanya membaca dan melompati.
Berikut adalah cara seseorang dapat mendeklarasikan SerialVersionUID,
private static final long serialVersionUID = 3487495895819393L;