作者:释怀来源:http://www.topthink.com/topic/11361.html您觉得自己懂 JAVA 编程?事实上,大多数程序员对于 Java 平台都是浅尝则止,只学习了足以完成手头上任务的知识而已 。在本系列 中,Ted Neward 深入挖掘 Java 平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程挑战 。
关于本系列
大约一年前,一个负责管理应用程序所有用户设置的开发人员,决定将用户设置存储在一个 Hashtable中,然后将这个 Hashtable 序列化到磁盘,以便持久化 。当用户更改设置时,便重新将 Hashtable 写到磁盘 。
这是一个优雅的、开放式的设置系统,但是,当团队决定从 Hashtable 迁移到 Java Collections 库中的HashMap 时,这个系统便面临崩溃 。
Hashtable 和 HashMap 在磁盘上的格式是不相同、不兼容的 。除非对每个持久化的用户设置运行某种类型的数据转换实用程序(极其庞大的任务),否则以后似乎只能一直用Hashtable 作为应用程序的存储格式 。
团队感到陷入僵局,但这只是因为他们不知道关于 Java 序列化的一个重要事实:Java 序列化允许随着时间的推移而改变类型 。当我向他们展示如何自动进行序列化替换后,他们终于按计划完成了向 HashMap 的转变 。
本文是本系列的第一篇文章,这个系列专门揭示关于 Java 平台的一些有用的小知识 — 这些小知识不易理解,但对于解决 Java 编程挑战迟早有用 。
将 Java 对象序列化 API 作为开端是一个不错的选择,因为它从一开始就存在于 JDK 1.1 中 。本文介绍的关于序列化的 5 件事情将说服您重新审视那些标准 Java API 。
Java 序列化简介
Java 对象序列化是 JDK 1.1 中引入的一组开创性特性之一,用于作为一种将 Java 对象的状态转换为字节数组,以便存储或传输的机制,以后,仍可以将字节数组转换回 Java 对象原有的状态 。
实际上,序列化的思想是 “冻结” 对象状态,传输对象状态(写到磁盘、通过网络传输等等),然后 “解冻” 状态,重新获得可用的 Java 对象 。所有这些事情的发生有点像是魔术,这要归功于 ObjectInputStream/ObjectOutputStream 类、完全保真的元数据以及程序员愿意用Serializable 标识接口标记他们的类,从而 “参与” 这个过程 。
清单 1 显示一个实现 Serializable 的 Person 类 。
清单 1. Serializable Person
文章插图
将 Person 序列化后,很容易将对象状态写到磁盘,然后重新读出它,下面的 JUnit 4 单元测试对此做了演示 。
清单 2. 对 Person 进行反序列化
文章插图
到现在为止,还没有看到什么新鲜的或令人兴奋的事情,但是这是一个很好的出发点 。我们将使用 Person 来发现您可能不知道的关于 Java 对象序列化的 5 件事 。
1. 序列化允许重构
序列化允许一定数量的类变种,甚至重构之后也是如此,ObjectInputStream 仍可以很好地将其读出来 。
Java Object Serialization 规范可以自动管理的关键任务是:
- 将新字段添加到类中
- 将字段从 static 改为非 static
- 将字段从 transient 改为非 transient
重构序列化类
既然已经知道序列化允许重构,我们来看看当把新字段添加到 Person 类中时,会发生什么事情 。
如清单 3 所示,PersonV2 在原先 Person 类的基础上引入一个表示性别的新字段 。
清单 3. 将新字段添加到序列化的 Person 中
文章插图
序列化使用一个 hash,该 hash 是根据给定源文件中几乎所有东西 — 方法名称、字段名称、字段类型、访问修改方法等 — 计算出来的,序列化将该 hash 值与序列化流中的 hash 值相比较 。
为了使 Java 运行时相信两种类型实际上是一样的,第二版和随后版本的 Person 必须与第一版有相同的序列化版本 hash(存储为 private static final serialVersionUID 字段) 。
因此,我们需要 serialVersionUID 字段,它是通过对原始(或 V1)版本的 Person 类运行 JDK serialver命令计算出的 。
一旦有了 Person 的 serialVersionUID,不仅可以从原始对象 Person 的序列化数据创建 PersonV2 对象(当出现新字段时,新字段被设为缺省值,最常见的是“null”),还可以反过来做:即从 PersonV2 的数据通过反序列化得到 Person,这毫不奇怪 。
推荐阅读
- Java NIO 2.0相关知识点
- 关于机油的那点事儿
- 关于茶的诗句及描写品茶的诗句茶诗句子
- 在生物的进化过程中,人类出现于 关于生物进化的原因人们普遍接受的是
- 关于茶的作文,军训如茶欣赏
- 学习JAVA的十二大步骤,值得你借鉴
- Java开发者必备的9个网站
- 如何更好的使用JAVA线程池
- Java秒杀系统实战系列:商品秒杀代码实战
- 关于茶叶的知识绿茶叶分类名称知识