fastjson:差点被几个漏洞毁了一世英名 | 2020 年最后一篇文章

01、前世今生

我是 fastjson,是个地地道道的杭州土著,但我始终怀揣着一颗走向全世界的雄心。这不,我在 GitHub 上的简介都换成了英文,国际范十足吧/p>

方法中创建了一个 Writer 对象,然后调用我提供的一个静态方法 来得到 JSON 字符串。

来看一下打印后的结果。

如果想反序列化的话,执行以下的代码即可。

调用静态方法 ,传递两个参数,一个是 JSON 字符串,一个是对象的类型。

如果想把 JSON 字符串转成集合的话,需要调用另外一个静态方法 。

如果没有特殊要求的话,我敢这么说,以上 3 个方法就可以覆盖到你绝大多数的业务场景了。

03、使用注解

有时候,你的 JSON 字符串中的 key 可能与 Java 对象中的字段不匹配,比如大小写;有时候,你需要指定一些字段序列化但不反序列化;有时候,你需要日期字段显示成指定的格式。

这些特殊场景,我统统为你考虑到了,只需要在对应的字段上加上 注解就可以了。

先来看一下 注解的定义吧。

name 用来指定字段的名称,format 用来指定日期格式,serialize 和 deserialize 用来指定是否序列化和反序列化。

我建议在 getter 字段上使用 注解。来看一下测试代码。

此时的输出结果如下所示。

JSON 字符串中的 Age 首字母为大写,birthday 的格式符合“年月日”的预期,name 字段没有出现在结果中,说明没有被序列化。

04、序列化特性

为了满足更多个性化的需求,我在 SerializerFeature 类中定义了很多特性,你可以在调用 方法的时候进行指定。

  • PrettyFormat,让 JSON 格式打印得更漂亮一些
  • WriteClassName,输出类名
  • UseSingleQuotes,key 使用单引
  • WriteNullListAsEmpty,List 为空则输出 []
  • WriteNullStringAsEmpty,String 为空则输出“”

等等等等,更多新技能,等待你去开锁。我这里写个简单的 demo 供你参考。

对比一下配置前和配置后的结果。

05、我为什么快

众所周知,把 Java 对象序列化成 JSON 字符串,是不可能使用字符串直接拼接的,因为这样性能很差。比字符串拼接更好的办法就是使用 。

StringBuilder 尽管已经很好了,但在性能上还有上升的空间。“自己动手,丰衣足食”,于是我就创造了一个 SerializeWriter 类,专门用来序列化。

SerializeWriter 类中包含了一个 ,每序列化一次,都要做一次分配,但我使用了 ThreadLocal 来进行优化,这样就能够有效地减少对象的分配和垃圾回收,从而提升性能。

除此之外,还有很多其他的细节,比如说使用 IdentityHashMap 而不是 HashMap,既可以避免多余的 操作,又可以避免多线程并发情况下的死循环。

再比如说,使用 asm 技术来避免反射导致的开销。

络上也出现了很多不和谐的声音,他们声称我是最垃圾的国产开源软件之一,只不过凭借着一些投机取巧赢得了国内开发者的信赖。

但更多的是,对我的不离不弃。

安全模式下, 方法会直接抛出异常。

06、尾声

不管前面的路还有多少艰难困苦,也不管还要面对多少风言风语,我都会砥砺前行,为了国产开源软件的蓬勃发展,我愿意做一个先驱者,也愿意做一个持久战者。

2020 年的最后一篇文章!看到的就点个赞吧,2021 年顺顺利利。

推荐阅读:

Github 疯传!史上最强!BAT 大佬「LeetCode刷题手册」电子书开放下载了!

一个三线程序员的2020年,CSDN 10 万粉里程碑达成

太赞了,GitHub 上标星 115k+ 的 Java 教程!

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92167 人正在系统学习中

fastjson:差点被几个漏洞毁了一世英名 | 2020 年最后一篇文章

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年11月27日
下一篇 2020年11月27日

相关推荐