java - 可序列化继承

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

最佳答案

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


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

transient A aInstance = new A();

如果这样做,当 BBB 实例被反序列化时,aInstance 将为 null,即使如果在序列化实例时该字段为非 null

关于java - 可序列化继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930083/

相关文章:

java - Google Sheets API - 如何在表格顶部追加新行?(Android)

java - 当您看到序列化的 Java 对象时,您会想到什么

java - 可以使用复杂的对象类型作为 Avro 中映射的键吗?

c# - 如何使用固定的 32 位长度通过匿名管道发送整数?

java - 在gui中使用sleep方法,不起作用

java - 方法返回类型来实现多个接口(interface) - 再次

java - 将提供的依赖项中的特定包添加到 jar 中

java - Jersey Spring 过滤器的单元测试

java - 在 jackson 解析日期的正确日期格式是什么?

android - 将哈希表序列化为android上的文件