Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可通过继承序列化_Java_Serialization - Fatal编程技术网

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();

如果执行此操作,
a
B
BB
实例反序列化时,
aInstance
将为
null
,即使该实例序列化时该字段为非
null

BB
具有类型为
a
的字段,并且
a
不实现
可序列化
。在可序列化类中,所有字段的类型都必须是可序列化的,这些类型的字段的类型也必须是可序列化的,依此类推


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

transient A aInstance = new A();
如果执行此操作,
a
B
BB
实例反序列化时,
aInstance
将为
null
,即使实例序列化时字段为非
null