写点什么

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

作者:No8g攻城狮
  • 2023-02-15
    河南
  • 本文字数:1596 字

    阅读完需:约 5 分钟

序列化是相对比较重要也比较简单,但也比较容易被忽视的一类基础性知识。序列化在网络应用特别是如今的分布式系统中被大量使用,理解好序列化是理解好网络应用以及分布式系统架构的基础。

在面试中也会被经常问到,所以这个部分的内容还是需要掌握的。

一、序列化与反序列化

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


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

序列化最终的目的是为了对象可以跨平台存储和进行网络传输,而我们进行跨平台存储和网络传输的方式就是 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,为博主原创文章,如果需要转载,请注明出处,谢谢!


完结!

发布于: 刚刚阅读数: 3
用户头像

No8g攻城狮

关注

熟了再告诉你 2022-12-03 加入

热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长

评论

发布
暂无评论
【Java基础】常用序列化技术与方式_通信协议_No8g攻城狮_InfoQ写作社区