深入理解Java的序列化和反序列化机制——Serializable
2012-04-04 12:29
501 查看
在网络通信(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
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
相关文章推荐
- 深入理解Java中的序列化(Serializable)
- 深入理解java的垃圾回收处理机制
- 我对Java Serializable(序列化)的理解和总结(转)
- Java Serializable(序列化)的理解和总结、具体实现过程
- 深入理解java异常处理机制
- 关于java异常处理机制的深入理解
- 深入理解java异常处理机制
- 深入理解Java并发机制(2)--volatile关键字
- java深入理解---异步回调机制实例解析
- java深入理解反射机制
- 深入理解java异常处理机制
- 深入理解Java序列化中的SerialVersionUid
- 深入理解 Java 垃圾回收机制
- [置顶] 深入理解java SPI机制
- 深入理解java异常处理机制
- 深入理解java动态代理机制
- 深入理解java异常处理机制
- 深入理解Java序列化中的SerialVersionUid
- 深入理解Java Proxy机制
- 深入理解Java垃圾回收机制