public class Parent implements Serializable {
private int i;
// ...
}
public class Child extends Parent {
private Thread t = new Thread(); // a non-serializable object
// ...
}
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.
}
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;
}
}
4条答案
按热度按时间lmvvr0a81#
我想问的是,实现了"Serializable"接口的父对象的子对象是否也实现了"Serializable"接口,或者换句话说,该子对象是否可以被序列化?
第一部分的答案是肯定的,这是Java继承的自然结果。
第二部分的答案("换句话说...")是不总是1!
想想这个:
可以序列化
Parent
的示例,但不能序列化Child
的示例...因为该示例具有类型(Thread
)未实现Serializable
的属性。如果尝试序列化具有非空t
字段的Child
示例,则会发生异常。现在,如果
t
被声明为transient
,或者Child
避免使用默认的序列化机制,那么Child
就可以被序列化,但是我的观点是,序列化是一个紧急属性,而不是可继承属性。1-这是不管你认为javadoc说什么!
3pmvbmvn2#
是的。如果父类实现了
Serializable
,那么所有子类也都是Serializable
。B
也实现了Serializable
。ha5z0ras3#
当父对象可序列化时,我们不需要无参数构造函数。
但是当子节点是可序列化的而不是父节点时,我们必须在父节点中有一个无参数常量,以便在反序列化时根据需要设置值,否则我们将使用默认值。
jdgnovmf4#
如果父类拥有可序列化行为,则默认情况下所有子类都拥有可序列化行为。
注意:当读取反序列化对象时,将能够检索序列化状态.