java “可序列化”类的子类是否自动“可序列化”?

nafvub8i  于 2023-02-02  发布在  Java
关注(0)|答案(4)|浏览(178)

实现Serializable接口的类的子类是否也实现Serializable?换句话说,子类的示例是否也可以被序列化?

lmvvr0a8

lmvvr0a81#

我想问的是,实现了"Serializable"接口的父对象的子对象是否也实现了"Serializable"接口,或者换句话说,该子对象是否可以被序列化?
第一部分的答案是肯定的,这是Java继承的自然结果。
第二部分的答案("换句话说...")是不总是1!
想想这个:

public class Parent implements Serializable {
    private int i;
    // ...
}

public class Child extends Parent {
    private Thread t = new Thread();   // a non-serializable object
    // ...
}

可以序列化Parent的示例,但不能序列化Child的示例...因为该示例具有类型(Thread)未实现Serializable的属性。如果尝试序列化具有非空t字段的Child示例,则会发生异常。
现在,如果t被声明为transient,或者Child避免使用默认的序列化机制,那么Child就可以被序列化,但是我的观点是,序列化是一个紧急属性,而不是可继承属性。
1-这是不管你认为javadoc说什么!

3pmvbmvn

3pmvbmvn2#

是的。如果父类实现了Serializable,那么所有子类也都是Serializable

static class A implements Serializable {
}

static class B extends A {
}

public static void main(String[] args) {
    Serializable b = new B(); // <-- this is a legal statement. 
}

B也实现了Serializable

ha5z0ras

ha5z0ras3#

当父对象可序列化时,我们不需要无参数构造函数。
但是当子节点是可序列化的而不是父节点时,我们必须在父节点中有一个无参数常量,以便在反序列化时根据需要设置值,否则我们将使用默认值。

jdgnovmf

jdgnovmf4#

如果父类拥有可序列化行为,则默认情况下所有子类都拥有可序列化行为。

class Parent implements Serializable{

    int x;

}

class Children extends Parent{

    int m;
    public static void main(String args[]){
    Children c = new Children();
    c.m =10;
    c.x =20;
    // Enter Serialization Code;
    // Enter De serialization Code;
}
}

注意:当读取反序列化对象时,将能够检索序列化状态.

相关问题