如果我的类实现了可序列化,我是否必须在其子类中实现它?

2022-09-01 05:55:22

如果我有B扩展A...和A实现可序列化,我是否必须编写“B实现可序列化”?

我想不是,但我想确认...

另外,如果我把序列化ID放在A...我还需要在B中放一个吗?A 中的序列化 ID 应该受到保护(而不是私有)吗?


答案 1

是的。子类不需要显式标记为可序列化。

并且,将id标记为将(从编译器的角度来看)。protected

但是,作为良好的做法,每个班级都应该有自己的私人 。serialVersionUID


答案 2

您不必将派生项显式标记为可序列化,它将被继承。但是,来自父级的 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


推荐