Java序列化机制详解
来源:互联网 发布:js删除节点本身 编辑:程序博客网 时间:2024/06/14 05:15
Java对象序列化是JDK1.1中引入的机制,用于将Java对象的状态转换为字节数组,以便存储和传输,并且可以将字节数组转换回Java对象原有的状态。Java对象序列化的思想是:“冻结”Java对象状态,写入磁盘或者通过网络传输,然后“解冻”Java对象状态,恢复出Java对象状态。
本文主要分三个部分:
1、Java对象序列化和反序列化的基本流程;
2、Java序列化机制使用过程中需要注意的一些关键点;
3、Java序列化机制一些不常被使用的功能;
Java对象下序列化和反序列化的基本流程:
Java对象的序列化流程:
下面给出writeHierarchy的部分代码:
if (osc.hasMethodWriteObject()) { final Method method = osc.getMethodWriteObject(); try { method.invoke(object, new Object[] { this }); executed = true; } catch (InvocationTargetException e) { Throwable ex = e.getTargetException(); if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } else if (ex instanceof Error) { throw (Error) ex; } throw (IOException) ex; } catch (IllegalAccessException e) { throw new RuntimeException(e.toString()); }}if (executed) { drain(); output.writeByte(TC_ENDBLOCKDATA);} else { // If the object did not have a writeMethod, call // defaultWriteObject defaultWriteObject();}
可以看到在这部分代码中,会判断Java对象是否重写了writeObject方法,如果重写了writeObject方法,则通过反射调用writeObject方法,否则调用defaultWriteObject方法。
Java对象的反序列化流程:
下面给出readObjectForClass的详细代码:
if (targetClass == null || !mustResolve) { readMethod = null;} else { readMethod = classDesc.getMethodReadObject();}if (readMethod != null) { // We have to be able to fetch its value, even if it is private readMethod.setAccessible(true); try { readMethod.invoke(object, this); } catch (InvocationTargetException e) { Throwable ex = e.getTargetException(); if (ex instanceof ClassNotFoundException) { throw (ClassNotFoundException) ex; } else if (ex instanceof RuntimeException) { throw (RuntimeException) ex; } else if (ex instanceof Error) { throw (Error) ex; } throw (IOException) ex; } catch (IllegalAccessException e) { throw new RuntimeException(e.toString()); }} else { defaultReadObject();}if (hadWriteMethod) { discardData();}
可以看到在这部分代码中,会判断Java对象是否重写了readObject方法,如果重写了readObject方法,则通过反射调用readObject方法,否则调用defaultReadObject方法。
Java序列化机制使用过程中需要注意的一些关键点:
1、序列化只针对对象状态,不针对类状态,所以,序列化的过程中是不会保存静态变量的;
2、如果子类实现了Serializable接口,父类没有实现Serializable接口,那么在子类的序列化过程中只会保存子类中定义的成员变量;
3、使用transient关键字修饰的成员变量,在序列化过程中不会被保存,在反序列化过程中会被置为默认值;
Java序列化机制一些不常被使用的功能:
1、Java序列化机制允许重构:Java序列化允许一定数量的类变化,甚至在经过类重构之后,ObjectInputStream仍然可以将Java对象恢复出来,Java Object Serialization规范可以自动管理的关键任务是:a、在类中添加新字段;b、将字段从static改为非static;c、将字段从transient改为非transient;序列化会使用一个hash值,即serialVersionUID,这个hash值根据源文件中几乎所有内容(字段类型,字段名称,方法名称等等)计算得到。为了使Java运行时相信重构后和重构前的Java类是一致的,需要保证不同版本的Java类的serialVersionUID是相等的,最初版本的Java类的serialVersionUID可以通过运行JDK serialver命令得到。
2、使序列化过程变得安全:Java的序列化过程是将对象的状态以二进制格式保存到磁盘上,或者通过网络传输,可以很轻易地看到Java对象的内容。为了保证Java对象内容的安全性,有两类方法:1、hook Java对象的序列化过程,在上文分析Java对象序列化的基本流程时有提到可以重写对象的writeObject方法,可以在writeObject方法中进行数据模糊化操作,但是,这类方法只是对数据进行了模糊化操作,并不能保证数据不会被看到;b、对Java对象进行签名和密封,将Java对象放入javax.crypto.SealedObject或者java.security.SignedObject包装器中,将对象包装在SealedObject中,可以围绕原对象简历一个“包装盒”,需要使用对称秘钥才能打开,秘钥需要单独管理;SignedObject和SealedObject功能类似,用于数据验证。
0 0
- Java序列化机制详解
- java序列化机制详解
- Java 对象序列化机制详解
- java序列化机制
- Java序列化机制
- java序列化机制
- Java序列化机制
- Java 序列化机制
- Java序列化机制
- Java序列化机制
- 【Java】Java序列化机制
- JAVA对象序列化机制
- 浅析Java序列化机制
- java序列化机制学习
- JAVA对象序列化机制
- Java 序列化机制解析
- Java序列化机制拾遗
- java serializable序列化机制
- git学习笔记
- GUI编程【一】
- 俄罗斯方块.C语言
- jdbc和Hibernate (oracle和mySql)连接数据库 代码步骤
- 简单工厂模式(由专门的类来创建实例)
- Java序列化机制详解
- 配置管理·十六
- View关于坐标的几个方法和属性
- web项目的Linux服务器部署发布以及域名访问
- 你不知道的关于淘宝公司的秘密——淘宝成立内幕
- 网站前端设计中解决不同分辨率电脑测量尺寸不同的问题
- 【逻辑思考】有时评论比内容更精彩
- 软件开发技术职位分析及职业规划
- spfa