可序列化的继承

问题描述 投票:1回答:1

BBB的父母。 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;}
    }
java serialization
1个回答
4
投票

BB有一个A类型的领域,而A没有实现Serializable。在可序列化的类中,所有字段的类型必须是可序列化的,这些类型的字段类型也必须是可序列化的,等等。


或者(尽管您可能不希望这样),您可以使用transient关键字声明要从序列化中排除的字段:

transient A aInstance = new A();

如果你这样做,当aInstancenull实例被反序列化时,B将是BB,即使该实例被序列化时该字段是非null

© www.soinside.com 2019 - 2024. All rights reserved.