为什么在尝试将子类读入父类变量时没有错误?我认为在创建一个已经被编译器读取的对象之前 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();
}
}
1条答案
按热度按时间lg40wkob1#
不,这两个班的课程不一样
serialVersionUID
. 没有引发异常,因为类B
可以成功重建。例如,当serialVersionUID
不匹配或何时匹配A
不会实现默认构造函数。当你反序列化
objectInputStream.readObject()
,安Object
可以安全地投回B
. 自B
延伸A
,可以向上转换为类型的对象A
–就像代码中发生的那样。另一方面,我强烈建议您定义
serialVersionUID
如果您直接使用序列化来存储和检索对象,那么您的类。你可以得到
serialVersionUID
以下是两个等级中的一个: