java—为什么在父类中反序列化时不抛出invalidclassexception

bzzcjhmw  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(428)

为什么在尝试将子类读入父类变量时没有错误?我认为在创建一个已经被编译器读取的对象之前 serialVersionUID 两个类(变量类和已读取的类)的 serialVersionUID 不相等 InvalidClassException 被抛出。我也是 A 类和 B 班级有相同的 serialVersionUID ?

import java.io.*;

class A  {}

class B extends A implements Serializable {}

public class Test
{
    public static void main(String[] args) throws IOException, ClassNotFoundException
    {
        FileOutputStream fileOutputStream = new FileOutputStream("b.bin");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        B b1 = new B();
        objectOutputStream.writeObject(b1);
        objectOutputStream.close();

        FileInputStream fileInputStream = new FileInputStream("b.bin");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        A a1 = (A) objectInputStream.readObject(); // why I don't have an InvalidClass Exception here
        objectInputStream.close();
    }
}
lg40wkob

lg40wkob1#

不,这两个班的课程不一样 serialVersionUID . 没有引发异常,因为类 B 可以成功重建。例如,当 serialVersionUID 不匹配或何时匹配 A 不会实现默认构造函数。
当你反序列化 objectInputStream.readObject() ,安 Object 可以安全地投回 B . 自 B 延伸 A ,可以向上转换为类型的对象 A –就像代码中发生的那样。
另一方面,我强烈建议您定义 serialVersionUID 如果您直接使用序列化来存储和检索对象,那么您的类。
你可以得到 serialVersionUID 以下是两个等级中的一个:

ObjectStreamClass.lookup(A.class).getSerialVersionUID()
ObjectStreamClass.lookup(B.class).getSerialVersionUID()

相关问题