JavaRush /Java Blog /Random-ID /Menanggapi artikel "Mengapa menggunakan SerialVersionUID ...
Сергей
Level 31
Киев

Menanggapi artikel "Mengapa menggunakan SerialVersionUID di dalam kelas Serializable di Java"

Dipublikasikan di grup Random-ID
Jadi.. Kami memiliki kelas yang ingin kami serialkan menggunakan metode konvensional (kami menggunakan Serializable) Menanggapi artikel "Mengapa menggunakan SerialVersionUID di dalam kelas Serializable di Java" - 1
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    private String name;
    private int number;
 }
Kami sedang menulis aplikasi pengujian. Saya akan segera mengatakan bahwa tujuan saya adalah untuk menunjukkan apa serialVersionUID.
package Serialization;

import java.io.*;

public class MainSerializable {
    final static String FILE_NAME = "c:\\File.dat";

    public static void serialize(Object object) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(FILE_NAME);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        objectOutputStream.writeObject(object);

        fileOutputStream.close();
        objectOutputStream.close();
    }

    public static Object deserialize() throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream(FILE_NAME);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        Object object = objectInputStream.readObject();

        objectInputStream.close();

        return object;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        SerializableClass serializableClass = new SerializableClass();

        serialize(serializableClass);

        SerializableClass newObject = (SerializableClass) deserialize();
    }
}
Semuanya bekerja dengan baik. Kelas diserialkan ke file FILE_NAME = "c:\\File.dat". Hari mulai gelap... :) Lupa menambahkan kolom ke kelas. Menambahkan:
public class SerializableClass implements Serializable {
    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
 }
Semuanya tampak baik-baik saja.. semuanya dikompilasi.. Jadi kita jalankan main, deserialisasi kelas SerializableClassdari file " c:\\File.dat":
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass newObject = (SerializableClass) deserialize();
}
Oh... Apa yang harus dilakukan...
Exception in thread "main" java.io.InvalidClassException: Serialization.SerializableClass; local class incompatible: stream classdesc serialVersionUID = 8129437039424566964, local class serialVersionUID = -8271479231760195917
	at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:689)
	at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1903)
	at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1772)
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
	at Serialization.MainSerializable.deserialize(MainSerializable.java:22)
	at Serialization.MainSerializable.main(MainSerializable.java:30)
Secara umum, semuanya adil. Kelas telah berubah dan serialVersionUID= nya -8271479231760195917, dan diserialkan dalam file serialVersionUID= 8129437039424566964. Apa yang harus dilakukan sekarang, apa yang harus dilakukan? Bagaimana cara membuat sebuah instance? Ada jalan keluar. Kita perlu mendeklarasikan di kelas kita: static final long serialVersionUID, yang sama dengan serialVersionUIDkelas :) yang berwarna abu-abu di file. Itu. kami berkata, silakan, saya akan melakukan deserialisasi.. Anda bisa.. versi Anda sama:
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    static final long serialVersionUID = 8129437039424566964L;

    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
}
Kami meluncurkan... Dan.. Semuanya berfungsi. Seperti yang saya pahami, kesalahan ini dapat dihindari jika kelas telah menyatakan sebelumnya:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    private String name;
    private int number;
}
Itu. kami tidak membiarkan Java melakukan perhitungannya sendiri serialVersionUIDberdasarkan algoritmanya (algoritma yang cukup rumit). Sekarang, setiap kali kelas berubah, kami serialVersionUID = 1L memeriksa:
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass serializableClass = new SerializableClass();

    serialize(serializableClass);

    SerializableClass newObject = (SerializableClass) deserialize();
}
Berhasil.. Dan sekarang seperti ini:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    //private String name;
    //private int number;
}
Ya.. Lalu?
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;
    public int A;
    protected String value;
    //private String name;
    //private int number;
}
Keren.. semuanya terus bekerja. Jadi saya menyelesaikan artikel pertama saya. Saya ingin menyampaikan semua ini di komentar, tetapi saya tidak dapat memahami simbolnya. Saya akan menerima kritik dan komentar yang bijaksana PS Terima kasih kepada penulis yang menginspirasi saya untuk melakukan kesenangan ini.. Mungkin, begitulah cara mereka belajar :) Semoga sukses untuk semuanya :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION