【发布时间】:2014-09-04 13:08:27
【问题描述】:
实现Serializable接口的类的子类是否也实现Serializable?也就是说,子类的实例也可以序列化吗?
【问题讨论】:
-
来自 javadoc “可序列化类的所有子类型本身都是可序列化的”。请阅读 javadoc。
-
@talex - 它不是那么简单。看我的回答,
标签: java serialization
实现Serializable接口的类的子类是否也实现Serializable?也就是说,子类的实例也可以序列化吗?
【问题讨论】:
标签: java serialization
我想问实现“Serializable”接口的parent的child是否也实现了“Serializable”接口,或者说那个child是否可以被序列化?
第一部分的答案是肯定的。这是 Java 继承的自然结果。
第二部分(“换句话说……”)的答案并不总是!
考虑一下:
public class Parent implements Serializable {
private int i;
// ...
}
public class Child extends Parent {
private final Thread t = new Thread(); // a non-serializable object
// ...
}
Parent 的实例可以被序列化,但Child 的实例不能……因为它有一个属性,其类型 (Thread) 没有实现 Serializable。
(现在,如果t 被声明为transient,或者如果Child 避免使用默认的序列化机制,则可以将Child 设为可序列化。但我的观点是,可序列化是一个紧急属性,而不是一个可继承的属性。)
【讨论】:
是的。如果父类实现了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。
【讨论】:
当父级可序列化时,我们不需要无参数构造函数。
但是当子级是可序列化的而不是父级时,我们必须在父级中有一个无参数的常量,以便在反序列化时根据需要设置值,否则我们将有默认值。
【讨论】:
Seriablizable的情况。
如果父类具有可序列化行为,则默认所有子类都具有可序列化行为。
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;
}
}
注意:当您读取反序列化对象时,您将能够检索序列化状态。
【讨论】: