JAVA核心技术学习——流与文件(4.对象流与序列化)

一.什么是序列化

把内存中对象的各种状态保存为一组字节,并且,还可以再将这些字节组装成对象。


默认的序列化对象内容:对象的类,类的签名,以及这个类及其超类中所有非静态和非瞬时的域的值。


使用场合:

将内存中的对象保存到文件或数据库中;

当使用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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值