序列化之二

序列化起初看样子,我以为紧紧是记录和还原对象的值而已,如A.x=10,B.y=20。
不过,其实很多情况确实没有想过,例如下面的例子:
Employee harry = new Employee("Harry Hacker", 50000, 1989, 10, 1);
Manager carl = new Manager("Carl Cracker", 80000, 1987, 10, 1);
carl.setSecretary(harry);
Manager tony = new Manager("Tony Tester", 40000, 1990, 10, 1);
tony.setSecretary(harry);

Employee staff = new Employee[3];
staff[0] = carl;
staff[1] = harry;
staff[2] = tony;

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("employee.dat"));
out.writeObject(staff);
out.close();


看得到,第一个对象被存入了后两个的对象中,以前从没想过是否能读出来过,那么看看下面的代码:
ObjectInputStream in = xxx;
Employee[] newStaff = (Employee[])in.readObject();
in.close();

newStaff[1].raiseSalary(10);
for(Employee e = newStaff) {
    System.out.println(e);
}

我们根据打印,可以看到,对象真的被完美还原了,很酷吧。
为什么会这样呢?原因是,我们这种机制,每个对象都是用一个 序列号(serial number)保存的,这就是这种机制之所以称为 对象序列化的原因
简单介绍一下算法:
  • 每遇到一个对象引用都关联一个序列号
  • 对于每个对象,当第一次遇见,保存其对象数据到流中。
  • 如果某个对象之前保存过,那么只记录“与之前保存过的序列号为x的对象相同”


在读回对象时,整个过程相反:
  • 对于流中的对象,在第一次遇到其序列号时,构建它,并使用流中数据来初始化它,然后记录这个序列号和新对象的关联。
  • 当下次遇到序列号同时为x的对象时,获取与这个序列号相关联的对象引用。


所以,综上所述,对象就被完整的还原了~

你可能感兴趣的:(java,Serializable)