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;}
}
答案 0 :(得分:4)
BB
的字段类型为A
,而A
未实现Serializable
。在可序列化的类中,所有字段的类型必须是可序列化的,这些类型的字段类型必须是可序列化的,等等。
或者(尽管您可能不希望这样),您可以使用transient
关键字来声明要从序列化中排除的字段:
transient A aInstance = new A();
如果您这样做,aInstance
将null
或B
实例反序列化,即使该字段为非BB
时该实例已被序列化。