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

时间:2022-11-14 17:34:25

在网络通信(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