如果我的类实现了可序列化,我是否必须在其子类中实现它?
2022-09-01 05:55:22
如果我有B扩展A...和A实现可序列化,我是否必须编写“B实现可序列化”?
我想不是,但我想确认...
另外,如果我把序列化ID放在A...我还需要在B中放一个吗?A 中的序列化 ID 应该受到保护(而不是私有)吗?
如果我有B扩展A...和A实现可序列化,我是否必须编写“B实现可序列化”?
我想不是,但我想确认...
另外,如果我把序列化ID放在A...我还需要在B中放一个吗?A 中的序列化 ID 应该受到保护(而不是私有)吗?
是的。子类不需要显式标记为可序列化。
并且,将id标记为将(从编译器的角度来看)。protected
但是,作为良好的做法,每个班级都应该有自己的私人 。serialVersionUID
您不必将派生项显式标记为可序列化,它将被继承。但是,来自父级的 serialVersionUID 虽然继承了,但序列化过程不会使用。如果不将串行VersionUID添加到子级,将生成一个。
见下文:
public class A implements Serializable {
protected static final long serialVersionUID = 1L;
}
public class B extends A {
}
public class Main {
public static void main(String[] args){
A a = new A();
B b = new B();
Class aClass = a.getClass();
Class bClass = b.getClass();
long aUid = ObjectStreamClass.lookup(aClass).getSerialVersionUID();
long bUid = ObjectStreamClass.lookup(bClass).getSerialVersionUID();
System.out.printf("serialVersionUID:\n");
System.out.printf("b inherited from a: %d\n", b.serialVersionUID);
System.out.printf("a used by serialization: %d\n",aUid);
System.out.printf("b used by serialization: %d\n",bUid);
}
}
输出:
串行版本 UID:
b 继承自 a: 1
序列化使用的 a:1
b 由序列化使用:-3675232183873847366