【Java 基础】常用序列化技术与方式
序列化是相对比较重要也比较简单,但也比较容易被忽视的一类基础性知识。序列化在网络应用特别是如今的分布式系统中被大量使用,理解好序列化是理解好网络应用以及分布式系统架构的基础。
在面试中也会被经常问到,所以这个部分的内容还是需要掌握的。
一、序列化与反序列化
序列化:就是把对象转化为可传输的字节的过程。
反序列化:就是把可传输的字节还原成对象的过程。
序列化最终的目的是为了对象可以跨平台存储和进行网络传输,而我们进行跨平台存储和网络传输的方式就是 IO,而 IO 支持的数据格式就是字节数组。
总结:序列化和反序列化本质上就是一个数据转换的过程。
二、序列化技术方案
常见的序列化技术实现方案有很多种,这里列举出了以下几种:JDK 原生序列化、Json 序列化、ProtoBuf 序列化、Hessian 序列化、Kryo 序列化。
三、序列化技术选型要点
在选择应用哪种序列化技术时,可以参考以下基本的考量点,通常是:
性能:需要考虑性能需求,序列化的速度和性能越高越好。
安全性:对于安全性的需要考量。JDK 序列化可能有卡死线程的漏洞。
占用空间大小:序列化的结果所占用的空间大小,序列化后的字节数据通常会持久化到硬盘(占用存储资源)或者在网络上传输给其他服务器(占用带宽资源),这个指标当然是越小越好。
跨语言:企业内部系统是否有跨语言通信的需求。
可维护性:技术流行程序,越流行的技术可维护性就越高,维护成本会越低。
所谓跨语言就是你用 Java 编写的进程,数据序列化之后能够在别的如 Python、PHP、C#等语言编写的进程内反序列化,就是所谓的跨语言。
四、JDK 原生序列化
Java 类通过实现 Serializable 接口来实现该类对象的序列化。
比较经典的、不被看好的序列化技术,JDK 自带的序列化技术。
开发者可以实现 java.io.Serializable 接口。然后用 java.io.ObjectOutputStream 类实现序列化,以及 java.io.ObjectInputStream 类实现反序列化。
JDK 自带的序列化技术,有很多缺点所以是 不被推荐使用的。就比如性能问题、序列化后的数据很占用空间、以及严重的反序列化安全漏洞。(可参考《Effective Java Third Edition》书中《12. Serialization Item 85: Prefer alternatives to Java Serialization》)
五、Json 序列化
当下最流行的序列化方式无非是 JSON 了,而且 JSON 作为前后端交互使用最广泛的格式。作为最通用的格式,各种语言都支持,并且可以支持复杂的对象。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON 序列化就是将数据对象转换为 JSON 字符串。在序列化过程中抛弃了类型信息,所以反序列化时只有提供类型信息才能准确地反序列化。JSON 可读性比较好,方便调试。
常见的 JSON 序列化框架有:fastJSON、Jackson、Gson 等。
六、ProtoBuf 序列化
谷歌推出的,是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于通信协议、数据存储等。序列化后体积小,一般用于对传输性能有较高要求的系统。
但是要使用 Protobuf 会相对来说麻烦一些,因为他有自己的语法,有自己的编译器,如果需要用到的话必须要去投入成本在这个技术的学习中。
Protobuf 有个缺点就是传输的每一个类的结构都要生成相对应的 proto 文件,如果某个类发生修改,还要重新生成该类对应的 proto 文件。
七、Hessian 序列化
Hessian 是一个轻量级的二进制 web service 协议,主要用于传输二进制数据。
在传输数据前 Hessian 支持将对象序列化成二进制流,相对于 JDK 原生序列化,Hessian 序列化之后体积更小,性能更优。
八、Kryo 序列化
Kryo 是一个开源的高性能的 Java 序列化/反序列化的库。Kryo 库的效率很高且作为序列化结果的 byte[]占用空间也较小,因此在诸多顶级项目里都有被使用。
Kryo 是一个 Java 序列化框架,号称 Java 最快的序列化框架。Kryo 在序列化速度上很有优势,底层依赖于字节码生成机制。
由于只能限定在 JVM 语言上,所以 Kryo 不支持跨语言使用。
本文首发于 CSDN,为博主原创文章,如果需要转载,请注明出处,谢谢!
完结!
版权声明: 本文为 InfoQ 作者【No8g攻城狮】的原创文章。
原文链接:【http://xie.infoq.cn/article/521f4fcdd14a00079012753ad】。文章转载请联系作者。
评论