知道的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() {
|