《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接口。)
AI 代码解读

在幕后,是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

目录
打赏
0
0
0
0
1408
分享
相关文章
重学Java基础篇—Java对象创建的7种核心方式详解
本文全面解析了Java中对象的创建方式,涵盖基础到高级技术。包括`new关键字`直接实例化、反射机制动态创建、克隆与反序列化复用对象,以及工厂方法和建造者模式等设计模式的应用。同时探讨了Spring IOC容器等框架级创建方式,并对比各类方法的适用场景与优缺点。此外,还深入分析了动态代理、Unsafe类等扩展知识及注意事项。最后总结最佳实践,建议根据业务需求选择合适方式,在灵活性与性能间取得平衡。
50 3
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
Java对象创建和访问
Java中判断一个对象是否是空内容
在 Java 中,不同类型的对象其“空内容”的定义和判断方式各异。对于基本数据类型的包装类,空指对象引用为 null;字符串的空包括 null、长度为 0 或仅含空白字符,可通过 length() 和 trim() 判断;集合类通过 isEmpty() 方法检查是否无元素;数组的空则指引用为 null 或长度为 0。
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
3月前
|
Object取值转java对象
通过本文的介绍,我们了解了几种将 `Object`类型转换为Java对象的方法,包括强制类型转换、使用 `instanceof`检查类型和泛型方法等。此外,还探讨了在集合、反射和序列化等常见场景中的应用。掌握这些方法和技巧,有助于编写更健壮和类型安全的Java代码。
113 17
|
3月前
|
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
109 4
Java对象一定分配在堆上吗?
|
5月前
|
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
148 5
|
5月前
|
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
64 3
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
143 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等