【Java基础】常用序列化技术与方式

举报
No8g攻城狮 发表于 2023/02/15 21:51:43 2023/02/15
【摘要】 序列化最终的目的是为了对象可以跨平台存储和进行网络传输,而我们进行跨平台存储和网络传输的方式就是 IO,而 IO 支持的数据格式就是字节数组。 总结:序列化和反序列化本质上就是一个数据转换的过程。

序列化是相对比较重要也比较简单,但也比较容易被忽视的一类基础性知识。序列化在网络应用特别是如今的分布式系统中被大量使用,理解好序列化是理解好网络应用以及分布式系统架构的基础。
在面试中也会被经常问到,所以这个部分的内容还是需要掌握的。

一、序列化与反序列化

序列化:就是把对象转化为可传输的字节的过程。
反序列化:就是把可传输的字节还原成对象的过程。

序列化最终的目的是为了对象可以跨平台存储和进行网络传输,而我们进行跨平台存储和网络传输的方式就是 IO,而 IO 支持的数据格式就是字节数组。

总结:序列化和反序列化本质上就是一个数据转换的过程。

二、序列化技术方案

常见的序列化技术实现方案有很多种,这里列举出了以下几种:JDK原生序列化、Json序列化、ProtoBuf序列化、Hessian序列化、Kryo序列化。

三、序列化技术选型要点

在选择应用哪种序列化技术时,可以参考以下基本的考量点,通常是:

  1. 性能:需要考虑性能需求,序列化的速度和性能越高越好。
  2. 安全性:对于安全性的需要考量。JDK序列化可能有卡死线程的漏洞。
  3. 占用空间大小:序列化的结果所占用的空间大小,序列化后的字节数据通常会持久化到硬盘(占用存储资源)或者在网络上传输给其他服务器(占用带宽资源),这个指标当然是越小越好。
  4. 跨语言:企业内部系统是否有跨语言通信的需求。
  5. 可维护性:技术流行程序,越流行的技术可维护性就越高,维护成本会越低。

所谓跨语言就是你用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,为博主原创文章,如果需要转载,请注明出处,谢谢!

完结!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。