当前位置: 首页 > 面试题库 >

Java对象的序列化和继承

况野
2023-03-14
问题内容

假设您有Foo和Bar这两个类,其中Bar扩展了Foo并实现了 Serializable

class Foo {

public String name;

public Foo() {
    this.name = "Default";
}

public Foo(String name) {
    this.name = name;
}
}

class Bar extends Foo implements java.io.Serializable {

public int id;

public Bar(String name, int id) {
    super(name);
    this.id = id;
}
}

注意,Foo没有实现Serializable。那么当bar序列化时会发生什么?

    public static void main(String[] args) throws Exception {

    FileOutputStream fStream=new FileOutputStream("objects.dat");
    ObjectOutputStream oStream=new ObjectOutputStream(fStream);
    Bar bar=new Bar("myName",21);
    oStream.writeObject(bar);

    FileInputStream ifstream = new FileInputStream("objects.dat");
    ObjectInputStream istream = new ObjectInputStream(ifstream);
    Bar bar1 = (Bar) istream.readObject();
    System.out.println(bar1.name + "   " + bar1.id);

}

它会显示“默认21”。问题是,为什么在未序列化类时调用默认构造函数?


问题答案:

可序列化只是给定类的“标记接口”。

但是该类必须遵守某些规则:

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

为了允许对不可序列化类的子类型进行序列化,该子类型可以负责保存和还原超类型的公共,受保护和(如果可访问)包字段的状态。仅当其扩展的类具有可访问的无参数构造函数以初始化类的状态时,该子类型才可以承担此责任。如果不是这样,则声明一个可序列化的类是错误的。

回答@Sleiman Jneidi问题,在上面提到的oracle文档中进行了评论

反序列化期间,将使用该类的公共或受保护的无参数构造函数来初始化不可序列化类的字段。无参数构造函数必须对可序列化的子类可访问。可序列化子类的字段将从流中恢复。

因此,调用了Foo类的默认no-arg构造函数,导致初始化。



 类似资料:
  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列

  • 以下代码导致此异常: 所以问题是:如何在GSON序列化和反序列化的泛型HashMap中获得正确的实例?

  • 上下文:我们使用Activiti作为流程引擎,使用Activiti-Rest作为应用程序的接口。由于这个问题与返回由Java序列化的对象的REST服务有关,所以我没有将其添加到标题中。 场景:我们有一个JBoss Wildfly实例,它包含一个EAR和一个包含类“ProcessContext”的模块(为了参考,我们将其称为X)。Activiti在这个EAR中运行,ServiceTasks(从进程中

  • 其中备注是对象内部的vavr列表字段。 现在,如果尝试将相同的值反序列化到对象中,则会出现错误: 当尝试反序列化时,为什么serified JSON文本不起作用? 在Java代码中有没有其他方法可以将vavr对象打印成文本格式并将其转换回POJO?

  • 本文向大家介绍java 对象的序列化和反序列化详细介绍,包括了java 对象的序列化和反序列化详细介绍的使用技巧和注意事项,需要的朋友参考一下      最近周末,对java 的基础知识做了一个整理,其中java 序列化和反序列化的资料进行了详细整理,这里做个笔记,希望也能帮助到读到此文的朋友。 一、序列化和反序列化的概念   把对象转换为字节序列的过程称为对象的序列化。   把字节序列恢复为对象