1.Java 序列化允许随着时间的推移而改变类型。http://www.ibm.com/developerworks/cn/java/j-5things1/
大约一年前,一个负责管理应用程序所有用户设置的开发人员,决定将用户设置存储在一个 Hashtable
中,然后将这个 Hashtable
序列化到磁盘,以便持久化。当用户更改设置时,便重新将 Hashtable
写到磁盘。
这是一个优雅的、开放式的设置系统,但是,当团队决定从 Hashtable
迁移到 Java Collections 库中的 HashMap
时,这个系统便面临崩溃。
Hashtable
和 HashMap
在磁盘上的格式是不相同、不兼容的。除非对每个持久化的用户设置运行某种类型的数据转换实用程序(极其庞大的任务),否则以后似乎只能一直用 Hashtable
作为应用程序的存储格式。
团队感到陷入僵局,但这只是因为他们不知道关于 Java 序列化的一个重要事实:Java 序列化允许随着时间的推移而改变类型。当我向他们展示如何自动进行序列化替换后,他们终于按计划完成了向 HashMap
的转变。
本文是本系列的第一篇文章,这个系列专门揭示关于 Java 平台的一些有用的小知识 — 这些小知识不易理解,但对于解决 Java 编程挑战迟早有用。
为了使 Java 运行时相信两种类型实际上是一样的,第二版和随后版本的 Person
必须与第一版有相同的序列化版本 hash(存储为 private static final serialVersionUID
字段)。因此,我们需要 serialVersionUID
字段,它是通过对原始(或 V1)版本的 Person
类运行 JDK serialver
命令计算出的。