扩展实现Serializable接口的类

7

如果我扩展了一个实现Serializable接口的类,那我需要这个类也实现Serializable接口吗?

例如:

public class classToBeExtended implements Serializable

那这样就可以了吗?
public class classThatWillExtend extends classToExtended

我需要这样做吗?
public class classThatWillExtend extends classToExtended implements Serializable

如果你扩展了一个实现了List接口的类,你需要再次声明子类也是一个List吗?为什么对于Serializable会有所不同呢? - Andy Turner
2个回答

6
如果一个类的任何超类实现了某个接口,那么子类也会实现该接口。在这方面,Serializable并不特殊,因此,一个Serializable类的子类不需要显式声明它们实现了Serializable。虽然他们可以这样声明,但这样做没有任何区别。
另一个含义是,如果你扩展了一个Serializable类,你应该确保子类本身也是可序列化的。例如,不要添加非transient字段的非可序列化类型,除非你准备添加必要的方法来支持它们。

3

根据Javadoc

可序列化类的所有子类型本身也是可序列化的


1
这有点误导人:实现Serializable接口的类的所有子类型也都实现了Serializable接口;但这并不意味着它们都可以被序列化。 - Andy Turner
2
实现Serializable是成为可序列化的必要条件,但不足以保证其可序列化。您可以向实现Serializable的类添加非可序列化类型的字段,如果这些字段非空(且引用的运行时类型不可序列化),则序列化将失败。 - Andy Turner
1
例如:class A { class B implements Serializable {} }B 的实例不可序列化,由于对不可序列化的 A 的隐式引用。 - Andy Turner
@AndyTurner。Java 不会尝试序列化对象状态,除非它实现了 Serializable 接口。代码尝试做什么和运行时尝试做什么是两回事。我认为 Java 无法保证实现 Serializable 接口的对象是100%可序列化的。其假定它是可序列化的唯一保证,就是标记 Serializable 接口本身。 - tsolakp
@tsolakp 我不确定你所说的“Java不会尝试”的意思是什么:当然它会尝试,而且当引用的运行时值指向一个非可序列化对象时,就会失败并抛出NotSerializableException异常。如果它没有尝试做任何事情,那么这个异常就不会发生。 - Andy Turner
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接