基本序列化的魔力仅仅是由两个方法产生:一个方法用于序列化对象并将它们写入一个流,另一个方法用于读取流并反序列化对象.
当序列化一个对象时,java序列化机制会负责保存对象的整个“对象图”,它是恢复所保存的对象所需一切内容的深度复制。相当于方法clone()。
如果Dog类中包含有Collar实例对象,序列化Dog对象,则会自动序列化Collar。如果Collar类包含一个指向另一对象的引用,则那个对象也会被序列化,依次类推。
但要同时对Collar实现Serializable接口。
但如果我们不序列化一个实例变量,比如Collar类可能是最终类,从而无法子类化。这就是引入transient修饰符的原因。
但有一种点很重要,也是反序列化与使用new创建对象之间的区别。使用new构造对象时,会发生实例变量都被赋予默认值、完成超类构造函数、实例变量对被赋予初始值、构造函数完成,但对象被反序列化时,不会发生这些事情。例如:
- <font size="3">class Foo implements Serializable{
- int num =3;
- void changeNum(){
- num = 10;
- }
- }</font>
复制代码
当changeNum()运行后,反序列化一个Foo实例,则反序列化的对象不会发生任何常规的初始化。
|