序列化与反序列化
参考:
一文带你了解序列化与反序列化基本原理与操作_序列化和反序列化-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 spec | jdk version | fastjson2 | fastjson1 | jackson | gson |
---|---|---|---|---|---|
aliyun_ecs.c8i.large | jdk1.8.0_371 | 3221.266 | 2242.933 (69.63%) | 1109.039 (34.43%) | 1012.118 (31.42%) |
jdk-11.0.19 | 3613.833 | 1958.644 (54.2%) | 966.209 (26.74%) | 979.065 (27.09%) | |
jdk-17.0.7 | 3973.012 | 2625.245 (66.08%) | 1018.698 (25.64%) | 1019.617 (25.66%) | |
graalvm_17.0.7+8.1 | 3800.747 | 3504.45 (92.2%) | 1074.656 (28.27%) | 1056.828 (27.81%) | |
aliyun_ecs.c8y.large | jdk1.8.0_371 | 4494.846 | 3085.452 (68.64%) | 1358.267 (30.22%) | 1412.577 (31.43%) |
jdk-11.0.19 | 5119.561 | 2915.271 (56.94%) | 1330.856 (26%) | 1411.811 (27.58%) | |
jdk-17.0.7 | 5115.273 | 4034.262 (78.87%) | 1361.581 (26.62%) | 1455.136 (28.45%) | |
graalvm_17.0.7+8.1 | 6028.42 | 4566.464 (75.75%) | 1424.79 (23.63%) | 1551.452 (25.74%) | |
orangepi5p | jdk1.8.0_371 | 3445.427 | 2378.522 (69.03%) | 1055.049 (30.62%) | 936.473 (27.18%) |
jdk-11.0.19 | 3673.967 | 2216.18 (60.32%) | 985.666 (26.83%) | 949.401 (25.84%) | |
jdk-17.0.7 | 3713.943 | 3194.434 (86.01%) | 1052.409 (28.34%) | 962.907 (25.93%) | |
graalvm_17.0.7+8.1 | 4005.105 | 3388.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 spec | jdk version | fastjson2 | fastjson1 | jackson | gson |
---|---|---|---|---|---|
aliyun_ecs.c8i.large | jdk1.8.0_371 | 3453.441 | 1544.712 (44.73%) | 2096.436 (60.71%) | 1013.014 (29.33%) |
jdk-11.0.19 | 3144.537 | 1414.201 (44.97%) | 1984.459 (63.11%) | 825.115 (26.24%) | |
jdk-17.0.7 | 3652.012 | 1509.688 (41.34%) | 2098.898 (57.47%) | 702.7 (19.24%) | |
graalvm_17.0.7+8.1 | 4994.468 | 1802.098 (36.08%) | 2565.164 (51.36%) | 720.686 (14.43%) | |
aliyun_ecs.c8y.large | jdk1.8.0_371 | 4694.206 | 2036.215 (43.38%) | 2419.939 (51.55%) | 1335.542 (28.45%) |
jdk-11.0.19 | 5214.882 | 1874.401 (35.94%) | 2626.637 (50.37%) | 1296.637 (24.86%) | |
jdk-17.0.7 | 5168.969 | 2868.758 (55.5%) | 2617.835 (50.65%) | 863.974 (16.71%) | |
graalvm_17.0.7+8.1 | 6234.468 | 2834.519 (45.47%) | 3139.284 (50.35%) | 869.592 (13.95%) | |
orangepi5p | jdk1.8.0_371 | 3444.148 | 1327.27 (38.54%) | 1829.602 (53.12%) | 828.635 (24.06%) |
jdk-11.0.19 | 3948.42 | 1293.318 (32.76%) | 1832.6 (46.41%) | 771.026 (19.53%) | |
jdk-17.0.7 | 3962.325 | 1357.162 (34.25%) | 1913.307 (48.29%) | 742.996 (18.75%) | |
graalvm_17.0.7+8.1 | 4360.2 | 1714.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对比
对比名称 | FastJson | Jackson |
---|---|---|
性能 | 更强 | |
调用方式 | 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: