可序列化是可继承的

时间:2013-05-18 15:10:42

标签: java serialization

可序列化是否可继承。特别是如果我有

class A implements Serializable{}

class B extends A{}

B类可序列化吗?

8 个答案:

答案 0 :(得分:2)

是。这源于Java中的继承概念。由于A是可序列化的,B扩展为A,因此B是serializalbe。

请注意,A和B的所有非静态非瞬态字段也必须包含Serializable对象,否则在尝试序列化时会在运行时出现NotSerializableException。

答案 1 :(得分:2)

答案 2 :(得分:2)

对以下代码进行了以下检查

boolean b = new B() instanceof Serializable;
System.out.println(b);

返回true

答案 3 :(得分:0)

是的,如果超类实现serializable,那么子类也是如此。

答案 4 :(得分:0)

如果一个类是Serializable,那么所有子类都是Serializable。但是如果你想阻止其超类是Serializable的子类是可序列化的,那么它也是可能的。

如果您想阻止,请使用

NotSerializableException - 当实例需要具有Seri​​alizable接口时抛出。序列化运行时或实例的类可以抛出此异常。参数应该是类的名称。

参考官方文档 - http://docs.oracle.com/javase/6/docs/api/java/io/NotSerializableException.html

通过这种方式使用它可以完成这项任务

private void writeObject(ObjectOutputStream out) throws IOException {

    throw new NotSerializableException(“Not today!”);
}


private void readObject(ObjectInputStream in ) throws IOException {

    throw new NotSerializableException(“Not today!”);

}

如何对子类进行序列化但是父类不是

如果Sub类是Serializable,那绝对不意味着它的超类也是Serializable。当子类被反序列化时,超类的无参数构造函数将运行。

答案 5 :(得分:0)

oracle tutorial

  

接口在Java编程中扮演另一个非常重要的角色   语言。但是,接口不是类层次结构的一部分   他们与班级合作。 Java编程语言   不允许多重继承(继承将在后面讨论   在本课中),但接口提供了另一种选择。

     

在Java中,一个类只能从一个类继承,但它可以实现   多个界面。因此,对象可以有多种类型:   他们自己的类的类型和所有接口的类型   他们实施。这意味着如果声明变量是   接口的类型,其值可以引用任何对象   从任何实现接口的类实例化。这是   本课程稍后将在标题为“使用a   接口作为类型。“

我想你的意思是如果你有一个函数foo获得(Serializable ptr),你可以用Class B的实例调用它,所以答案是肯定的,那就是理念

此外,您可以覆盖A(祖先)实现。

答案 6 :(得分:0)

基类实现的所有接口都由其派生类继承。不仅仅是Serializable。

答案 7 :(得分:0)

我同意Serializable-ness是继承的,但是偶然的工具无法识别这个事实(尽管很少)。所以,即使它不是必需的,我也会额外努力将子类声明为实现Serializable。