《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.1 保存和加载序列化对象
为了保存对象数据,首先需要打开一个ObjectOutputStream对象:
现在,为了保存对象,可以直接使用ObjectOutputStream的writeObject方法,如下
所示:
为了将这些对象读回,首先需要获得一个ObjectInputStream对象:
然后,用readObject方法以这些对象被写出时的顺序获得它们:
但是,对希望在对象输出流中存储或从对象输入流中恢复的所有类都应进行一下修改,这些类必须实现Serializable接口:
Serializable接口没有任何方法,因此你不需要对这些类做任何改动。在这一点上,它与在卷Ⅰ第6章中讨论过的Cloneable接口很相似。但是,为了使类可克隆,你仍旧需要覆盖Object类中的clone方法,而为了使类可序列化,你不需要做任何事。
注意:你只有在写出对象时才能用writeObject/readObject方法,对于基本类型值,你需要使用诸如writeInt/readInt或writeDouble/readDouble这样的方法。(对象流类都实现了DataInput/DataOutput接口。)
在幕后,是ObjectOutputStream在浏览对象的所有域,并存储它们的内容。例如,当写出一个Employee对象时,其名字、日期和薪水域都会被写出到输出流中。
但是,有一种重要的情况需要考虑:当一个对象被多个对象共享,作为它们各自状态的一部分时,会发生什么呢?
为了说明这个问题,我们对Manager类稍微做些修改,假设每个经理都有一个秘书:
现在每个Manager对象都包含一个表示秘书的Employee对象的引用,当然,两个经理可以共用一个秘书,正如图2-5和下面的代码所示的那样:
保存这样的对象网络是一种挑战,在这里我们当然不能去保存和恢复秘书对象的内存地址,因为当对象被重新加载时,它可能占据的是与原来完全不同的内存地址。
与此不同的是,每个对象都是用一个序列号(serial number)保存的,这就是这种机制之所以称为对象序列化的原因。下面是其算法:
在读回对象时,整个过程是反过来的。
对于对象输入流中的对象,在第一次遇到其序列号时,构建它,并使用流中数据来初始化它,然后记录这个顺序号和新对象之间的关联。 当遇到“与之前保存过的序列号为x的对象相同”标记时,获取与这个顺序号相关联的对象引用。注意:在本章中,我们使用序列化将对象集合保存到磁盘文件中,并按照它们被存储的样子获取它们。序列化的另一种非常重要的应用是通过网络将对象集合传送到另一台计算机上。正如在文件中保存原生的内存地址毫无意义一样,这些地址对于在不同的处理器之间的通信也是毫无意义的。因为序列化用序列号代替了内存地址,所以它允许将对象集合从一台机器传送到另一台机器。
程序清单2-3是保存和重新加载Employee和Manager对象网络的代码(有些对象共享相同的表示秘书的雇员)。注意,秘书对象在重新加载之后是唯一的,当newStaff[1]被恢复时,它会反映到经理们的secretary域中。
相关文章
- java工具类之按对象中某属性排序
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
- java数据类型是有符号的,那与有些无符号的如何区别
- spring-从普通java类取得注入spring Ioc容器的对象的方案
- Java-对象池
- Effective Java 第三版——6. 避免创建不必要的对象
- java对象的六大原则
- 什么是Java序列化?如何实现序列化?
- Java 连接oracle时报错,ORA-28040:没有匹配的验证协议
- 区块链编程七大语言,使用最多的竟是Java(1),Java岗面试
- Java对象实例化过程
- 美团Java面试题,mysql使用教程5.5
- 转:java 类名 this 的使用
- Elasticsearch Java API 的使用
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.2 理解对象序列化的文件格式
- Java 定时器 Timer 的使用.
- Java中Class对象详解
- Java魔法堂:注解用法详解——@SuppressWarnings
- day11<Java开发工具&常见对象>
- 用Maven实现一个protobuf的Java例子
- java 反射 获取Class对象的三种方式
- idea 将java导出为可执行jar及导入jar依赖
- 全网最全!彻底弄透Java处理GMT/UTC日期时间(上)
- Java对象为啥要实现Serializable接口?
- Java 多个引用类型变量引用同一个对象
- java发送post请求,使用multipart/form-data的方式传递参数--《优化》
- .pgr照片文件解析,C++与Java存储数据差别大小端模式
- java-maven-多模块拆分构建项目
- Flink大数据实时计算系列-第一个程序JAVA版本-分组统计 KeyedProcessFunction写法
- java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】
- 如何计算Java对象所占内存的大小
- json 串转成 java 对象再拼接成前台 html 元素
- Java HashSet特点:不重复(对象的哈希代码一样)、无序
- java对象怎么转json数组
- Java数据结构——代码实现双向链表的方法
- c++性能之对象与指针性能比较、以及java与c++性能对比实测
- JAVA通信编程(四)——UDP通讯