1
方法签名:
在ObjectOutputStream 里 是 writeObject()
在ObjectInputStream 里 是 readObject()
在被序列化的对象中 是
writeObject(ObjectOutputStream) 和 readObject( ObjectInputStream )
(事实上
在writeObject (ObjectOutputStream) 中内部实现
是oos 的 writeObject() [前者] 通过反射 调用了被序列化对象的writeObject[后者])
2
方法签名
private writeObject(ObjectOutputStream) private readObject( ObjectInputStream )
public writeExteanal(ObjectOutputStream) private readExternal( ObjectInputStream )
3
在main中
创建一个 ObjectOutputStream
目的是 调用其 writeObject() 实现对象的序列化
如果一个流序列化了a b,那么反序列化的调用顺序也是得到的a、b
在被序列化的对象中的 writeObject(ObjectOutputStream)函数中
ObjectOutputStream来自于参数
目的是 序列化对象中的某个引用类型的字段
如果一个流序列化了a b,那么反序列化的调用顺序也是得到的b、a
4
Externalizable继承自 Serializable
前者先调用public 默认构造器 再调用readExtern
后者不通过构造器 直接readObject
(Serializable这样说:
读取对象类似于运行新对象的构造方法。为对象分配内存并将其初始化为零 (NULL)。为不可序列化类调用无参数构造方法,然后从以最接近 java.lang.object 的可序列化类开始和以对象的最特定类结束的流恢复可序列化类的字段。)
5
只要利用同一个流
那么无论对象有多少次引用 只被序列化一次
6
一个父类实现Serializable接口后,他的子类都将自动的实现序列化
要为一个没有实现Serializable接口的父类,编写一个能够序列化的子类要做两件事情:
其一、父类要有一个无参的constructor;
其二、子类要负责序列化(反序列化)父类的域。
在readObject中不要使用可被覆写的方法
7
readResolve 与 writeReplace
这两个方法都是返回一个object
writeReplace先于writeObject或writeExternal被调用
readResolve晚于readObject或readExternal被调用(事实上,是先调用readObject构造了一个临时对象,然后调用readResolve,按指定的方法返回真正的对象。此时临时对象将等待gc)
所以这两个方法常用于实例控制
如果要利用readResolve进行单例控制 需要所有域都为transient