快速业务通道

关于Java对象序列化您不知道的5件事 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

关于Java对象序列化您不知道的5件事

时间:2010-11-20 IBM Ted Neward

数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会 到比一般程序员多知道一点关于 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

package com.tedneward; public class Person    implements java.io.Serializable {    public Person(String fn, String ln, int a)    {      this.firstName = fn; this.lastName = ln; this.age  = a;    }    public String getFirstName() { return firstName; }    public String getLastName() { return lastName; }    public int getAge() { return age; }    public Person getSpouse() { return spouse; }    public void setFirstName(String value) { firstName =  value; }    public void setLastName(String value) { lastName =  value; }    public void setAge(int value) { age = value; }    public void setSpouse(Person value) { spouse =  value; }    public String toString()    {      return "[Person: firstName=" + firstName +        " lastName=" + lastName +        " age=" + age +        " spouse=" + spouse.getFirstName() +        "]";    }    private String firstName;    private String lastName;    private int age;    private Person spouse; }

关于Java对象序列化您不

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号