《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.1 保存和加载序列化对象

简介: 本节书摘来华章计算机《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一书中的第2章 ,第2.4.1节,[美] 凯S.霍斯特曼(Cay S. Horstmann) 著陈昊鹏 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4.1 保存和加载序列化对象

为了保存对象数据,首先需要打开一个ObjectOutputStream对象:
image

现在,为了保存对象,可以直接使用ObjectOutputStream的writeObject方法,如下
所示:
image

为了将这些对象读回,首先需要获得一个ObjectInputStream对象:
image

然后,用readObject方法以这些对象被写出时的顺序获得它们:
image

但是,对希望在对象输出流中存储或从对象输入流中恢复的所有类都应进行一下修改,这些类必须实现Serializable接口:
image

Serializable接口没有任何方法,因此你不需要对这些类做任何改动。在这一点上,它与在卷Ⅰ第6章中讨论过的Cloneable接口很相似。但是,为了使类可克隆,你仍旧需要覆盖Object类中的clone方法,而为了使类可序列化,你不需要做任何事。

注意:你只有在写出对象时才能用writeObject/readObject方法,对于基本类型值,你需要使用诸如writeInt/readInt或writeDouble/readDouble这样的方法。(对象流类都实现了DataInput/DataOutput接口。)

在幕后,是ObjectOutputStream在浏览对象的所有域,并存储它们的内容。例如,当写出一个Employee对象时,其名字、日期和薪水域都会被写出到输出流中。
但是,有一种重要的情况需要考虑:当一个对象被多个对象共享,作为它们各自状态的一部分时,会发生什么呢?
为了说明这个问题,我们对Manager类稍微做些修改,假设每个经理都有一个秘书:
image

现在每个Manager对象都包含一个表示秘书的Employee对象的引用,当然,两个经理可以共用一个秘书,正如图2-5和下面的代码所示的那样:
image

保存这样的对象网络是一种挑战,在这里我们当然不能去保存和恢复秘书对象的内存地址,因为当对象被重新加载时,它可能占据的是与原来完全不同的内存地址。
与此不同的是,每个对象都是用一个序列号(serial number)保存的,这就是这种机制之所以称为对象序列化的原因。下面是其算法:

  • 对你遇到的每一个对象引用都关联一个序列号(如图2-6所示)。
  • 对于每个对象,当第一次遇到时,保存其对象数据到输出流中。
  • 如果某个对象之前已经被保存过,那么只写出“与之前保存过的序列号为x的对象相同”。

image
image

在读回对象时,整个过程是反过来的。

  • 对于对象输入流中的对象,在第一次遇到其序列号时,构建它,并使用流中数据来初始化它,然后记录这个顺序号和新对象之间的关联。
  • 当遇到“与之前保存过的序列号为x的对象相同”标记时,获取与这个顺序号相关联的对象引用。
    注意:在本章中,我们使用序列化将对象集合保存到磁盘文件中,并按照它们被存储的样子获取它们。序列化的另一种非常重要的应用是通过网络将对象集合传送到另一台计算机上。正如在文件中保存原生的内存地址毫无意义一样,这些地址对于在不同的处理器之间的通信也是毫无意义的。因为序列化用序列号代替了内存地址,所以它允许将对象集合从一台机器传送到另一台机器。

程序清单2-3是保存和重新加载Employee和Manager对象网络的代码(有些对象共享相同的表示秘书的雇员)。注意,秘书对象在重新加载之后是唯一的,当newStaff[1]被恢复时,它会反映到经理们的secretary域中。
image
image

image

相关文章
|
21天前
|
存储 Java 编译器
【Java SE语法篇】7.面向对象——类和对象
【Java SE语法篇】7.面向对象——类和对象
【Java SE语法篇】7.面向对象——类和对象
|
1月前
|
存储 设计模式 安全
Java 编程问题:十、并发-线程池、可调用对象和同步器2
Java 编程问题:十、并发-线程池、可调用对象和同步器
28 0
|
7天前
|
存储 算法 Java
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
33 1
[Java]散列表的数据结构以及对象在JVM堆中的存储过程
|
1月前
|
存储 算法 Java
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
|
2天前
|
安全 前端开发 Java
百度搜索:蓝易云【JAVA系列之类加载机制详解】
类加载机制使得Java具有动态性和灵活性,允许在运行时动态加载新的类和资源。这也为Java的热部署和插件化开发提供了基础。类加载器的层次结构和双亲委派机制保证了类的安全性和共享性,使得Java应用具有高度的可靠性和稳定性。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
7 1
|
4天前
|
缓存 Java 编译器
Java 构造函数与修饰符详解:初始化对象与控制权限
Java 构造函数 是一种特殊的类方法,用于在创建对象时初始化对象的属性。它与类名相同,并且没有返回值类型。 构造函数的作用: 为对象的属性设置初始值 执行必要的初始化操作
25 0
|
5天前
|
Java 流计算
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
20 4
|
14天前
|
安全 Java
百度搜索:蓝易云【JAVA系列之类加载机制详解】
类加载机制的优势在于它可以延迟加载类,只有在需要使用时才加载,避免了不必要的资源消耗。此外,类加载机制也为Java提供了动态扩展的能力,可以在运行时加载新的类,实现插件化和热部署等特性。
18 0
|
26天前
|
Java
【JAVA】我和我的第一个“对象”相遇
【JAVA】我和我的第一个“对象”相遇
41 0
【JAVA】我和我的第一个“对象”相遇
|
1月前
|
Java API 索引
Java 编程问题:十、并发-线程池、可调用对象和同步器4
Java 编程问题:十、并发-线程池、可调用对象和同步器
19 0