快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
知道的5件事(2) 时间:2010-11-20 IBM Ted Neward

将 Person 序列化后,很容易将对象状态写到磁盘,然后重新读出它,下面 的 JUnit 4 单元测试对此做了演示。

清单 2. 对 Person 进行反序列化

public class SerTest {    @Test public void serializeToDisk()    {      try      {        com.tedneward.Person ted = new  com.tedneward.Person("Ted", "Neward", 39);        com.tedneward.Person charl = new  com.tedneward.Person("Charlotte",          "Neward", 38);        ted.setSpouse(charl); charl.setSpouse(ted);        FileOutputStream fos = new FileOutputStream ("tempdata.ser");        ObjectOutputStream oos = new ObjectOutputStream (fos);        oos.writeObject(ted);        oos.close();      }      catch (Exception ex)      {        fail("Exception thrown during test: " +  ex.toString());      }      try      {        FileInputStream fis = new FileInputStream ("tempdata.ser");        ObjectInputStream ois = new ObjectInputStream (fis);        com.tedneward.Person ted = (com.tedneward.Person)  ois.readObject();        ois.close();        assertEquals(ted.getFirstName(), "Ted");        assertEquals(ted.getSpouse().getFirstName(),  "Charlotte");        // Clean up the file        new File("tempdata.ser").delete();      }      catch (Exception ex)      {        fail("Exception thrown during test: " +  ex.toString());      }    } }

到现在为止,还没有看到什么新鲜的或令人兴奋的事情,但是这是一个很好 的出发点。我们将使用 Person 来发现您可能不 知道的关于 Java 对象序列化 的 5 件事。

1. 序列化允许重构

序列化允许一定数量的类变种,甚至重构之后也是如此,ObjectInputStream 仍可以很好地将其读出来。

Java Object Serialization 规范可以自动管理的关键任务是:

将新字段添加到类中

将字段从 static 改为非 static

将字段从 transient 改为非 transient

取决于所需的向后兼容程度,转换字段形式(从非 static 转换为 static 或从非 transient 转换为 transient)或者删除字段需要额外的消息传递。

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

时间:2010-11-20 IBM Ted Neward

重构序列化类

既然已经知道序列化允许重构,我们来看看当把新字段添加到 Person 类中 时,会发生什么事情。

如清单 3 所示,PersonV2 在原先 Person 类的基础上引入一个表示性别的 新字段。

清单 3. 将新字段添加到序列化的 Person 中

enum Gender {    MALE, FEMALE } public class Person    implements java.io.Serializable {    public Person(String fn, String ln, int a, Gender g)    {      this.firstName = fn; this.lastName = ln; this.age =  a; this.gender = g;    }    public String getFirstName() { return firstName; }    public String getLastName() { return lastName; }    public Gender getGender() { return gender; }    public int getAge() {

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号