SerialVersionUID được cung cấp để xác định khả năng tương thích giữa đối tượng đã được loại bỏ và phiên bản hiện tại của lớp.
Như vậy, nó không thực sự cần thiết trong phiên bản đầu tiên của một lớp, hoặc trong trường hợp này, trong một lớp cơ sở trừu tượng. Bạn sẽ không bao giờ có một thể hiện của lớp trừu tượng đó để tuần tự hóa/deserialize, vì vậy nó không cần một serialVersionUID.
(Tất nhiên, nó tạo ra một cảnh báo trình biên dịch, mà bạn muốn để có được thoát khỏi, phải không?)
Hóa comment james' là đúng. SerialVersionUID của lớp cơ sở trừu tượng không được truyền cho các lớp con. Do đó, bạn cần làm cần serialVersionUID trong lớp cơ sở của mình.
Mã để kiểm tra:
import java.io.Serializable;
public abstract class Base implements Serializable {
private int x = 0;
private int y = 0;
private static final long serialVersionUID = 1L;
public String toString()
{
return "Base X: " + x + ", Base Y: " + y;
}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Sub extends Base {
private int z = 0;
private static final long serialVersionUID = 1000L;
public String toString()
{
return super.toString() + ", Sub Z: " + z;
}
public static void main(String[] args)
{
Sub s1 = new Sub();
System.out.println(s1.toString());
// Serialize the object and save it to a file
try {
FileOutputStream fout = new FileOutputStream("object.dat");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(s1);
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
Sub s2 = null;
// Load the file and deserialize the object
try {
FileInputStream fin = new FileInputStream("object.dat");
ObjectInputStream ois = new ObjectInputStream(fin);
s2 = (Sub) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(s2.toString());
}
}
Chạy chính trong Sub một lần để có được nó để tạo và lưu một đối tượng. Sau đó thay đổi serialVersionUID trong lớp Base, chú thích các dòng trong chính để lưu đối tượng (vì vậy nó không lưu lại nó, bạn chỉ muốn tải một cái cũ), và chạy lại nó. Điều này sẽ dẫn đến một ngoại lệ là
java.io.InvalidClassException: Base; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
Nguồn
2009-05-21 14:50:40
Tôi tiếp tục viết câu trả lời, sau đó nhận ra tôi không biết, mặc dù tôi có linh cảm. 1 cho một câu hỏi tôi không thể trả lời. –