JavaRush /Blog Java /Random-VI /Trả lời bài viết "Tại sao nên sử dụng SerialVersionUID bê...
Сергей
Mức độ
Киев

Trả lời bài viết "Tại sao nên sử dụng SerialVersionUID bên trong lớp Serializable trong Java"

Xuất bản trong nhóm
Vì vậy.. Chúng tôi có một lớp mà chúng tôi muốn tuần tự hóa bằng các phương thức thông thường (chúng tôi sử dụng Serializable) Trả lời bài viết "Tại sao nên sử dụng SerialVersionUID bên trong lớp Serializable trong Java" - 1
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    private String name;
    private int number;
 }
Chúng tôi đang viết một ứng dụng thử nghiệm. Tôi sẽ nói ngay rằng mục tiêu của tôi là thể hiện những gì 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();
    }
}
Mọi thứ đều hoạt động tuyệt vời. Lớp được tuần tự hóa thành một tệp FILE_NAME = "c:\\File.dat". Trời dần tối... :) Quên thêm trường vào lớp. Thêm vào:
public class SerializableClass implements Serializable {
    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
 }
Mọi thứ có vẻ ổn.. mọi thứ biên dịch.. Vì vậy, chúng tôi chạy nó main, giải tuần tự hóa lớp SerializableClasstừ tệp " c:\\File.dat":
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass newObject = (SerializableClass) deserialize();
}
Ôi... phải làm gì đây...
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)
Nói chung mọi thứ đều công bằng. Lớp này đã thay đổi và nó serialVersionUID= -8271479231760195917, và được tuần tự hóa trong tệp serialVersionUID= 8129437039424566964. Phải làm gì bây giờ, phải làm gì? Làm thế nào để tạo một cá thể? Có một lối ra. Chúng ta cần khai báo trong lớp: static final long serialVersionUID, tương đương với serialVersionUIDlớp màu xám :) trong tệp. Những thứ kia. chúng tôi đã nói, hãy tiếp tục, tôi sẽ giải tuần tự hóa.. bạn có thể.. các phiên bản của bạn đều giống nhau:
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;    // +
}
Chúng tôi khởi chạy... Và.. Mọi thứ đều hoạt động. Theo tôi hiểu, lỗi này có thể tránh được nếu lớp đã khai báo trước:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    private String name;
    private int number;
}
Những thứ kia. chúng tôi không để Java tự tính toán serialVersionUIDdựa trên các thuật toán của nó (thuật toán khá phức tạp). Bây giờ, bất cứ khi nào một lớp thay đổi, chúng tôi serialVersionUID = 1L sẽ kiểm tra:
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass serializableClass = new SerializableClass();

    serialize(serializableClass);

    SerializableClass newObject = (SerializableClass) deserialize();
}
Nó hoạt động.. Và bây giờ như thế này:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    //private String name;
    //private int number;
}
Vâng.. Và như vậy?
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;
    public int A;
    protected String value;
    //private String name;
    //private int number;
}
Tuyệt vời.. mọi thứ vẫn tiếp tục hoạt động. Vậy là tôi đã hoàn thành bài viết đầu tiên của mình. Tôi muốn đưa tất cả những điều này vào phần bình luận, nhưng tôi không thể hiểu được các ký hiệu. Tôi sẽ chấp nhận những lời chỉ trích và nhận xét tỉnh táo PS Cảm ơn tác giả đã truyền cảm hứng cho tôi thực hiện những điều thú vị này.. Có lẽ, đây là cách họ học :) Chúc mọi người may mắn :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION