Java 可通过继承序列化
Java 可通过继承序列化,java,serialization,Java,Serialization,BB是B的父级A是一个独立类。我对这段代码所做的就是将B类型的对象写入一个文件,然后将其读回 如图所示的代码运行正常。此外,我们知道,如果一个类是可序列化的,那么它的子类也会自动地可序列化的 考虑到这一点,如果B不是可序列化的,而BB(其父级)是可序列化的,为什么我会得到一个NotSerializableException?我希望这两种情况下的输出相同 public class Main { public static void main(String[] args) {
BB
是B
的父级A
是一个独立类。我对这段代码所做的就是将B
类型的对象写入一个文件,然后将其读回
如图所示的代码运行正常。此外,我们知道,如果一个类是可序列化的
,那么它的子类也会自动地可序列化的
考虑到这一点,如果B不是可序列化的,而BB(其父级)是可序列化的,为什么我会得到一个NotSerializableException
?我希望这两种情况下的输出相同
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
不实现可序列化
。在可序列化类中,所有字段的类型都必须是可序列化的,这些类型的字段的类型也必须是可序列化的,依此类推
或者(尽管您可能不希望这样),您可以使用
transient
关键字声明要从序列化中排除的字段:
transient A aInstance = new A();
如果执行此操作,
aB
或BB
实例反序列化时,aInstance
将为null
,即使该实例序列化时该字段为非null
。BB
具有类型为a
的字段,并且a
不实现可序列化
。在可序列化类中,所有字段的类型都必须是可序列化的,这些类型的字段的类型也必须是可序列化的,依此类推
或者(尽管您可能不希望这样),您可以使用transient
关键字声明要从序列化中排除的字段:
transient A aInstance = new A();
如果执行此操作,aB
或BB
实例反序列化时,aInstance
将为null
,即使实例序列化时字段为非null