【问题标题】:Extending a class that implements Serializable扩展实现 Serializable 的类
【发布时间】:2018-04-29 05:21:48
【问题描述】:

如果我扩展一个实现 Serializable 的类,我是否需要该类也实现 Serializable?

例如,如果我有,

public class classToBeExtended implements Serializable

那么这就够了吗?

public class classThatWillExtend extends classToExtended

或者我需要这样做吗?

public class classThatWillExtend extends classToExtended implements Serializable

【问题讨论】:

  • 如果扩展了实现List的类,是否需要再次声明子类也是List?为什么Serializable 会有所不同?

标签: java serialization extends serializable implements


【解决方案1】:

如果一个类的任何超类实现了给定的接口,那么子类也实现了该接口。 Serializable 在这方面并不特殊,所以不,Serializable 类的子类不需要明确声明它们实现了Serializable。他们可以这样声明,但这样做没有任何区别。

另一个含义是,如果你扩展一个Serializable 类,你应该确保子类本身确实是可序列化的。例如,不要添加不可序列化类型的非transient 字段,除非您也准备好添加必要的方法来支持它们。

【讨论】:

    【解决方案2】:

    Javadoc:

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

    【讨论】:

    • 这有点误导:实现Serializable的类的所有子类型也实现Serializable;这并没有说明是否真的可以序列化。
    • @Andy Turner。不明白你的意思。从 Javadoc 声明来看,它应该意味着子类是可序列化的,而无需实现接口。至少我是这么看的。
    • 实现Serializable可序列化的必要条件但不是充分条件。您可以将不可序列化类型的字段添加到实现Serializable 的类中,如果这些字段非空(并且引用的运行时类型不可序列化),则序列化将失败。
    • 例如:class A { class B implements Serializable {} }B 的实例不可序列化,因为隐式引用了不可序列化的A
    • 当然可以。但该声明的重点是 Java 运行时将尝试序列化子类。能不能成功是另外一个问题。
    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2016-10-24
    • 2013-03-27
    相关资源
    最近更新 更多