BB
是 B
的父级。 A
是一个独立的类。我对这段代码所做的一切就是将类型为 B
的对象写入文件,然后将其读回。
显示的代码运行正常。此外,我们知道如果一个类是Serializable
,那么它的子类也自动Serializable
。
考虑到这一点,为什么我会得到一个 NotSerializableException
如果不是 B 是可序列化的,而是 BB(它的父级)是?我希望两种情况下的输出相同。
public class Main {
public static void main(String[] args) {
B bb = new B();
B bb2 = null;
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("text.ser"));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("text.ser"))){
oos.writeObject(bb);
bb2 = (B) ois.readObject();
}catch(Exception e){e.printStackTrace();}
}
}
class A {
int a = 1, hello=7;
A() {a = 2;}
}
class BB {
int bb = 1;
A aInstance = new A();
BB() {bb = 2;}
}
class B extends BB implements Serializable{
int b = 1;
B() {b = 2;}
}
最佳答案
BB
有一个A
类型的字段,A
没有实现Serializable
。在可序列化类中,所有字段的类型都必须是可序列化的,这些类型的字段类型也必须是可序列化的,等等。
或者(尽管您可能不希望这样做),您可以使用 transient
关键字来声明要从序列化中排除的字段:
transient A aInstance = new A();
如果这样做,当 B
或 BB
实例被反序列化时,aInstance
将为 null
,即使如果在序列化实例时该字段为非 null
。
关于java - 可序列化继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930083/