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();
如果你这样做,当aInstance
或null
实例被反序列化时,B
将是BB
,即使该实例被序列化时该字段是非null
。