黑马程序员技术交流社区

标题: 对象序列化问题 [打印本页]

作者: 卞潇洋    时间: 2012-11-22 16:04
标题: 对象序列化问题
基本序列化的魔力仅仅是由两个方法产生:一个方法用于序列化对象并将它们写入一个流,另一个方法用于读取流并反序列化对象.
当序列化一个对象时,java序列化机制会负责保存对象的整个“对象图”,它是恢复所保存的对象所需一切内容的深度复制。相当于方法clone()。

如果Dog类中包含有Collar实例对象,序列化Dog对象,则会自动序列化Collar。如果Collar类包含一个指向另一对象的引用,则那个对象也会被序列化,依次类推。

但要同时对Collar实现Serializable接口。

但如果我们不序列化一个实例变量,比如Collar类可能是最终类,从而无法子类化。这就是引入transient修饰符的原因。
但有一种点很重要,也是反序列化与使用new创建对象之间的区别。使用new构造对象时,会发生实例变量都被赋予默认值、完成超类构造函数、实例变量对被赋予初始值、构造函数完成,但对象被反序列化时,不会发生这些事情。例如:
  1. <font size="3">class Foo implements Serializable{
  2. int num =3;
  3. void changeNum(){
  4.   num = 10;
  5. }
  6. }</font>
复制代码

当changeNum()运行后,反序列化一个Foo实例,则反序列化的对象不会发生任何常规的初始化。




作者: 许庭洲    时间: 2012-11-23 07:27
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2