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