一.什么是序列化
把内存中对象的各种状态保存为一组字节,并且,还可以再将这些字节组装成对象。
默认的序列化对象内容:对象的类,类的签名,以及这个类及其超类中所有非静态和非瞬时的域的值。
使用场合:
将内存中的对象保存到文件或数据库中;
当使用RMI(远程方法remote method invocation调用);
在网络中传递对象时,都会用到对象序列化。
相关类:
ObjectInputStream/ObjectOutputStream
对象所在类须实现Serializable接口(Serializable接口无方法)
对象序列化算法:
1.对遇到的每一个对象引用都关联一个序列号
2.对于每个对象,第一次遇到时保存期对象数据到流中。
3.如果某个对象已经被保存过,之写出“与之间保存过的xx对象相同”
4.对于流中的对象,第一次遇到其序列号是,构建它并使用流中的数据来初始化它,然后记录这个顺序号和新对象的关联。
5.当遇到“与之间保存过的xx对象相同”这个标记时,获取相关联的对象引用。
二.修改默认的序列化机制
1. 将对象标记为transient后 ,对象被序列化石总是被跳过。
2.在可序列化的类中定义下列方法后,数据域不会自动序列化,取而代之调用下列方法
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
private void writeObject(ObjectOutputStream out) throws IOException;
3.在上记方法中写出(write())被标记成transient的对象,会使其序列化
4.使用实现Externalizable接口替代Serializable接口,可以自定义序列化机制。
具体实现写在readExternal(ObjectInputStream in) writeExternal(ObjectOutputStream out)方法中
注意:使用Externalizable进行序列化,读取对象时会调用被序列化类的无参构造器去创建一个新的对象,然后再将被保存对象的字段的值分别填充到新对象中。
由于这个原因,实现Externalizable接口的类必须要提供一个无参的构造器,且它的访问权限为public。