深入理解Java的序列化和反序列化机制——Serializable

在网络通信(Socket)或远程过程调用(RPC(RMI))中,我们通常都会发送和接收一个对象,比如

ObjectOutputStream oos = new ObjectOutputStream(out);

oos.writeObject(obj);

……

ObjectInputStream ois  = new ObjectInputStream(in);

Object obj = ois.readObject();

当一个对象实现了Serializable接口后,意味着这个对象是可以序列化的,当然这个操作对用户来说是透明的,为什么呢?因为用户不用关心JVM到底都做了什么呢?用户只关心将这个对象声明成可序列化的就行了。那么到底什么是JAVA序列化和反序列化呢?


1.什么是学序列化(反序列化)?

序列化:将一个对象以字节的方式来描述(存储)。

反序列化:将字节转换(翻译)成一个对象。


2.JVM是如何实现序列化(对象和字节的转换)的?

◆将对象实例相关的类元数据输出。

                    
◆递归地输出类的超类描述直到不再有超类。

                    
◆类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。

                    
◆从上至下递归输出实例的数据

具体实现细节可以参考Core Java书籍


3.哪些对象是不可(不需要)序列化的?

(1).静态成员是不可序列化的

(2).被transient修饰的对象时不可序列化的,或者说你在设计的时候发现,如果这个对象不需要序列化,你可以把它声明成transient

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值