【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,为博主原创文章,如果需要转载,请注明出处,谢谢!
完结!
- 点赞
- 收藏
- 关注作者
评论(0)