JAVA序列化的秘密.pdfVIP

  • 13
  • 0
  • 约 53页
  • 2017-06-26 发布于天津
  • 举报
JAVA序列化的秘密.pdf

SecretofSerialization liujia [2011Q1] [有关java 序列化的一些琐事] 目录 为什么要有序列化3 序列化都干些啥4 首要问题:反序列化时如何生成实例5 是不是所有的类都需要序列化6 哪些东西需要序列化7 用transient保护敏感信息15 序列化算法15 定制自己的序列化算法24 严重漏洞:刻舟求剑32 单例模式不过是浮云34 同引用实例化问题37 常见的序列化攻击39 百家争鸣:hessian和mina也玩序列化43 工作中需要注意的点49 附录1ObjectOutputStream和ObjectInputStream50 附录2Serializable中的隐藏方法一览51 参考文献52 序列化的秘密 为什么要有序列化 任何事物的产生都是有其原因的,序列化也不例外。要说到序列化的起源,还得从最基本的 java 程序说起(本文介绍的是 java 序列化)。啥是 java 程序,简单来说就是一个进程一块内存,进程根据 类生成一堆实例,并放到内存中,这些实例进行交互运算,最终产生我们想要的结果。如下图所示: 图:java程序示意图 这样就有了一个依赖关系,即内存中的对象依赖于内存,而内存又依赖于进程。这个很好解释, 如果进程停止了,内存就被回收了;内存被回收了,内存中的对象也就 destroy 了。 这就产生了很大的限制,举几个例子: 1、一个程序停止了,内存中的对象也没了。但如果我想在新的程序中使用之前那个对象,该怎 么办? 2、网络上传输对象(网络两端不共享内存) 3、远程接口调用,两端在各自的虚拟机中运行,当然内存也不共享,那入参和结果如何传递? 4、…. 序列化就是来解决这些问题的。虽然内存不共享,但我们可以将对象转化为一段字节序列,并放 到流中,接下来就交给 I/O,可以存储在文件中、可以通过网络传输…;当我们想用到这些对象的时 候,再通过 I/O,从文件、网络上读取字节序列,根据这些信息重建对象。 序列化都干些啥 上面已经介绍了需要序列化的原因,并简单说了一下序列化做的事情,概括起来就是下面这张图: obj obj 序列化 反序列化 0x01 ….0x02 outputStream inputStream 0x01 ….0x02 文件 数据库 网络 顺便也解释了一下“反序列化”,反序列化就是序列化的逆过程,将对象还原的过程。不要认为 “反序列化”不重要,如果没有“反序列化”,那么“序列化”是没有任何意义的,光保存对象而用 不上,这傻事谁干啊。 再简单地照着这个图说下序列化的过程,不过这么几件事: 1、根据某种序列化算法(详见序列化算法),将对象转换为字节序列 2、将这个字节序列通过输出流写入到载体中(文件、数据库、网络等),详见附录 1 ObjectOutputStream 和 ObjectInputStream 3、字节序列通过载体进行保存/传输 4、当要用到这些对象的时候,程序通过输入流从载体中读取出字节序列 5、根据某种反序列化算法,将字节序列转换为对象,详见序列化算法 虽然过程很简单,但里面却有很多说道,下面就逐一介绍。 首要问题:反序列化时如何生成实例 为什么要谈这个问题呢,还是首要问题?有两个原因: 1、 正如上面说的,不能反序列化的序列化是没意义的,好像有点绕。再通

文档评论(0)

1亿VIP精品文档

相关文档