可序列化的继承

时间:2017-12-21 17:38:48

标签: java serialization

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;}
    }

1 个答案:

答案 0 :(得分:4)

BB的字段类型为A,而A未实现Serializable。在可序列化的类中,所有字段的类型必须是可序列化的,这些类型的字段类型必须是可序列化的,等等。

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

transient A aInstance = new A();

如果您这样做,aInstancenullB实例反序列化,即使该字段为非BB时该实例已被序列化。