序列化与反序列化

参考:
一文带你了解序列化与反序列化基本原理与操作_序列化和反序列化-CSDN博客

序列化(==Serialization==)是一种将对象以一连串的字节描述的过程,将程序中的对象,放入硬盘(文件)中保存就是序列化,如果不存放在磁盘中,而是一直存放在内存中,会增大内存的消耗;序列化就是将对象的状态信息转换为可以存储或传输的形式的过程;
将java对象转换为字节序列。

反序列化(==Deserialization==)是一种将这些字节重建成一个对象的过程,将硬盘(文件)中的字节码重新转成对象就是反序列化。
把字节序列回复为原先的java对象。

反序列化作用:
对象恢复:通过反序列化操作,可以从存储的字节流中还原对象的状态。这使得可以在程序重启后,读取保存的字节流并重新构造对象,从而快速恢复对象的状态。

分布式应用:在分布式系统中,可以将对象进行序列化,并在不同的计算机之间进行传输。接收方可以通过反序列化操作将字节序列转换为可操作的对象。

远程调用:某些远程通信框架使用序列化和反序列化来实现远程方法调用。方法调用和参数会被序列化成字节流发送给远程服务,然后通过反序列化在远程服务端还原方法调用和参数。

在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

Java中Json序列化与反序列化

参考:
Java常用的JSON序列化与反序列化工具实践_json序列化工具-CSDN博客

JSON(Java Script Object Notation)是一种轻量级的数据交换格式,通常用于在不同系统之间传输数据。它基于 JavaScript 对象语法,但已成为一种独立于语言的格式。JSON 数据以键值对的形式组织,易于阅读和编写。

为什么要使用 JSON?

1.简单易用:JSON的语法简单,易于理解和编写,可以快速地进行数据交换。

2.跨平台支持:JSON可以被多种编程语言解析和生成,可以在不同的平台和语言之间进行数据交换和传输。

3.数据交换格式:JSON是一种标准的数据交换格式,可以在Web应用程序中广泛使用,如前后端数据交互、API接口数据传输等。

4.轻量级:JSON的数据格式轻量级,传输数据时占用带宽较小,可以提高数据传输速度。

5.易于扩展:JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用。

6.安全性:JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性。

什么时候会使用 JSON?

1.前后端数据传输:当Web应用程序需要进行前后端数据传输时,可以使用JSON格式来传输数据,以便前后端之间进行数据交互。

2.API接口数据传输:当使用API接口进行数据传输时,可以使用JSON格式来传输数据,以便多个系统之间进行数据交互。

3.存储数据:当需要存储数据时,可以使用JSON格式来存储数据,以便后续的读取、修改和删除等操作。

4.日志记录:当需要记录日志时,可以使用JSON格式来记录日志信息,以便后续的分析和查询。

5.配置文件:当需要存储配置文件时,可以使用JSON格式来存储配置信息,以便后续的读取和修改操作。

JSON序列化与反序列化对比

java中比较常用的JSON工具 fastjson,fastjson2,jackson,gson。
FastJSON、Gson和Jackson性能对比_fastjson 首次慢-CSDN博客

参考:
fastjson_benchmark · alibaba/fastjson2 Wiki · GitHub

库版本 截止测试时间(2023-06-18)各个库的最新版本

  • fastjson2 2.0.38
  • fastjson1 1.1.83
  • jackson 2.15.1
  • gson 2.10.1

服务器环境

ecs.c8i.xlarge
ecs.c8y.xlarge
Orange Pi 5 Plus

反序列化对比 2.1 EishayParseString

将JSON格式字符串反序列化为Java对象,这个场景在fastjson中的代码如下:

String str = "...";
Bean bean = JSON.parseJSONObject(str, Bean.class);

在ecs.c8i.large-jdk11.0.19环境中,fastjson1只相当于只相当于fastjson2的54.2% ;jackson则只相当于fastjson2的26.74%; gson是fastjson2的27.09%,也就是说这个最常见的反序列化场景,fastjson2的性能差不多是jackson/gson的3~4倍。

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput(吞吐量)数据,越大越好。 第4列到第6列中的百分比是Throughput(吞吐量)相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs specjdk versionfastjson2fastjson1jacksongson
aliyun_ecs.c8i.largejdk1.8.0_3713221.2662242.933 (69.63%)1109.039 (34.43%)1012.118 (31.42%)
jdk-11.0.193613.8331958.644 (54.2%)966.209 (26.74%)979.065 (27.09%)
jdk-17.0.73973.0122625.245 (66.08%)1018.698 (25.64%)1019.617 (25.66%)
graalvm_17.0.7+8.13800.7473504.45 (92.2%)1074.656 (28.27%)1056.828 (27.81%)
aliyun_ecs.c8y.largejdk1.8.0_3714494.8463085.452 (68.64%)1358.267 (30.22%)1412.577 (31.43%)
jdk-11.0.195119.5612915.271 (56.94%)1330.856 (26%)1411.811 (27.58%)
jdk-17.0.75115.2734034.262 (78.87%)1361.581 (26.62%)1455.136 (28.45%)
graalvm_17.0.7+8.16028.424566.464 (75.75%)1424.79 (23.63%)1551.452 (25.74%)
orangepi5pjdk1.8.0_3713445.4272378.522 (69.03%)1055.049 (30.62%)936.473 (27.18%)
jdk-11.0.193673.9672216.18 (60.32%)985.666 (26.83%)949.401 (25.84%)
jdk-17.0.73713.9433194.434 (86.01%)1052.409 (28.34%)962.907 (25.93%)
graalvm_17.0.7+8.14005.1053388.239 (84.6%)1020.092 (25.47%)1002.879 (25.04%)

序列化对比 2.5EishayWriteString

这个是Java对象序列化成字符串, 这个是序列化最常用的场景之一。这个场景在fastjson中的代码如下:

Bean bean = ...;
String str = JSON.toJSONString(bean);

在这个最常用的序列化场景,fastjson2表现出远超fastjson1/jackson/gson的性能;这个场景gson表现很差,只有fastjson2的20~30%。

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput数据,越大越好。 第4列到第6列中的百分比是Throughput相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs specjdk versionfastjson2fastjson1jacksongson
aliyun_ecs.c8i.largejdk1.8.0_3713453.4411544.712 (44.73%)2096.436 (60.71%)1013.014 (29.33%)
jdk-11.0.193144.5371414.201 (44.97%)1984.459 (63.11%)825.115 (26.24%)
jdk-17.0.73652.0121509.688 (41.34%)2098.898 (57.47%)702.7 (19.24%)
graalvm_17.0.7+8.14994.4681802.098 (36.08%)2565.164 (51.36%)720.686 (14.43%)
aliyun_ecs.c8y.largejdk1.8.0_3714694.2062036.215 (43.38%)2419.939 (51.55%)1335.542 (28.45%)
jdk-11.0.195214.8821874.401 (35.94%)2626.637 (50.37%)1296.637 (24.86%)
jdk-17.0.75168.9692868.758 (55.5%)2617.835 (50.65%)863.974 (16.71%)
graalvm_17.0.7+8.16234.4682834.519 (45.47%)3139.284 (50.35%)869.592 (13.95%)
orangepi5pjdk1.8.0_3713444.1481327.27 (38.54%)1829.602 (53.12%)828.635 (24.06%)
jdk-11.0.193948.421293.318 (32.76%)1832.6 (46.41%)771.026 (19.53%)
jdk-17.0.73962.3251357.162 (34.25%)1913.307 (48.29%)742.996 (18.75%)
graalvm_17.0.7+8.14360.21714.457 (39.32%)2053.774 (47.1%)702.916 (16.12%)

https://zhuanlan.zhihu.com/p/700813222
JAVA面试题分享七十六:Jackson和fastjson的原理和区别?_jackson和fastjson的区别-CSDN博客

为什么要强制弃坑Fastjson而主推Jackson?-腾讯云开发者社区-腾讯云

fastjson和jackson对比

对比名称FastJsonJackson
性能更强
调用方式FastJSON提供了大量静态方法,使得调用非常简洁方便。你可以直接使用这些静态方法进行JSON的序列化和反序列化操作。Jackson需要实例化类ObjectMapper来进行操作,这可能相对繁琐一些。但可以通过封装成JSON工具类来简化调用过程。
生态相比于 Jackson,社区和文档资源可能较少被广泛应用于许多 Java 项目中。如springboot就集成来。
有大量的社区支持和文档资源。
安全曾经出现过安全漏洞,尤其是在反序列化过程中。通常被认为在安全性方面表现较好。

fastjson

fastjson快的原因

fastjson 的开发者温绍锦总结到:

1.“通过 ASM 动态 JIT 的方式针对每个 JavaBean 生成 Parser”。

ASM 是一种运行时生成字节码的技术。字节码是 JVM 的 “指令集”。fastjson 利用 ASM 在 JVM 运行时生成了代码,这些代码就像是我们给对象写了个 toString 来产生 JSON 字符串。序列化不再需要反射,也不用每次都扫描对象内容,速度自然快了。

// 我自己写了个 JSON 序列化,不让 ASM 自动生成了    
public String toString() {
        return "{" +
                "\"name\": \"" + name + "\"" +
                ", \"age\":" + age +
                "}";
}

2.“很多编程技巧”

fastjson 使用了 JavaLangAccess 、Unsafe这样的底层类,着重优化字符串处理,使得字符串的构建、遍历和编码都有了很大的速度提升。具体技巧可以看看:
fastjson_string_codec_methods · alibaba/fastjson2 Wiki · GitHub

在技术上,fastjson 是优秀的。“每提升 1%,就需要 100% 的付出”,在性能上,fastjson 相比竞品却是指数级提升,需要的投入想必不少。fastjson 的开发者是专注且创新的,这种精神值得学习!

快的代价

参考:

Java中Fastjson各版本漏洞对抗史与总结 - 先知社区](https://xz.aliyun.com/t/14872?time__1311=GqA2Y50K4IxBqDwqeqBKGQH9CCnmmx3x#toc-0)

如何取舍

  • 如果你的应用对序列化性能要求非常高,可以选择FastJSON。
  • 如果更关注反序列化性能或者需要更高级的功能和灵活性,那么Jackson是更好的选择。

选用fastjson注意什么?

[GitHub - alibaba/fastjson2:

Last modification:August 1st, 2024 at 07:00 pm
如果觉得我的文章对你有用,请随意赞赏