专栏首页芋道源码1024知乎:fastjson 这么快,为啥老外还是热衷 jackson?

知乎:fastjson 这么快,为啥老外还是热衷 jackson?

来源:甘明

dwz.cn/ztVmUvBI

知乎上有人提问:fastjson这么快,为啥老外还是热衷 jackson? 下面是甘明的回答,从各个方面分析了这个问题:

哈哈哈,我来回答这个问题!

因为我实在是对这两个库太熟悉了。

1、

你写个bean,然后属性里分别有包含_(下划线开头、#开头)之类的属性,序列化为json时,出现属性丢失,那么自然你也无法反序列化回来。

这个问题,1.2.14版本以后已经改正。

2、

翻阅fastjson的源码,你会发现有很多写死的代码,比如:针对spring之类的框架的各种处理,都是用classload判断是否存在这种类名。

这是什么意思呢?

意思就是如果你用spring的那种思想,自己写了个类似的功能,因为你这个项目里没有spring的那个类,那么用起来就有一堆bug;当然不仅限于这些,还有很多,比如ASM字节码织入部分,看源码的话,能发现的缺点数不胜数。

3、

其解析json主要是用的String类substring这个方法,所以解析起来非常“快”,因为申请内存次数很少。

但是因为jdk1.7之前substring的实现并没有new一个新对象,在使用的时候,如果解析的json非常多,稍不注意就会出现内存泄漏(比如一个40K的json,你在对象里引用了里边的一个key,即使这个key只有2字节,也会导致这40K的json无法被垃圾回收器回收),这也是“快”带来的负面效果。

而且这还不算,在jdk1.7以上版本对string的substring方法做了改写,改成了重新new一个string的方式,于是这个“快”的优势也不存在了。

最后

fastjson就是一个代码质量较差的国产类库,用很多投机取巧的的做法去实现所谓的“快”,而失去了原本应该兼容的java特性,对json标准遵循也不严格,自然很难在国际上流行。

json从发明到现在非常流行,并不是因为json快的原因(比json快且小巧的格式和类库一大把),而是因为json和web结合的时候更易于使用,对开发人员易于理解。

很多人拿fastjson和jackson比,就像拿非智能机和iphone比待机时间,其功能性不一样,jackson的很多功能fastjson并没有实现,所以这种对比也不客观。

fastjson之所以没在国际上流行起来,最主要的原因应该是开发者的思路全放到“快”上去了,而偏离了“标准”及功能性,质量也不够好,有点“舍本逐末”的味道。

当然在目前的环境下,国产软件能踏实的心态做好开源的不多,fastjson团队能这么快的反馈并修正问题,这种精神还是值得称赞的。希望国内的技术从业者能更重视“技术的原始需求”。

你觉得会是什么原因?欢迎在留言区讨论。



如果你喜欢这篇文章,喜欢,转发。

生活很美好,明天见(。・ω・。)ノ♡

本文分享自微信公众号 - 芋道源码(javayuanma)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 漫漫优化路,总会错几步!记一次接口优化!

    逻辑看似很简单,当初我也是这样认为的,于是预估5天完成,最后前前后后开发、联调、改bug直到上线差不多花了10天(当然这10天并不是只做这一件事情)

    芋道源码
  • 一起来学 SpringBoot 2.x | 第十一篇:集成 Swagger 在线调试

    随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染、前后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远。

    芋道源码
  • 一起来学 SpringBoot 2.x | 第九篇:整合 Lettuce Redis

    摘要: 原创出处 http://blog.battcn.com/2018/05/11/springboot/v2-nosql-redis/ 「唐亚峰」欢迎转载,...

    芋道源码
  • 强化学习(五)用时序差分法(TD)求解

        在强化学习(四)用蒙特卡罗法(MC)求解中,我们讲到了使用蒙特卡罗法来求解强化学习问题的方法,虽然蒙特卡罗法很灵活,不需要环境的状态转化概率模型,但是它...

    刘建平Pinard
  • 将MySQL去重操作优化到极致之三弹连发(二):多线程并行执行

            上一篇已经将单条查重语句调整到最优,但该语句是以单线程方式执行。能否利用多处理器,让去重操作多线程并行执行,从而进一步提高速度呢?比如我的实验环...

    用户1148526
  • java经典题解?

    指对象一旦被创建状态不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。

    技术从心
  • 7位数年薪抢人,DeepMind与Facebook人才大战又开火

    在加拿大蒙特利尔的一座共享办公大楼里,一间角落办公室里遍布着满是代码的黑色大屏幕。显示器并排堆放着,一个挨着一个,对于Facebook AI实验室(FAIR)加...

    新智元
  • jquery插件开发模板

    deepcc
  • 形态学操作—膨胀与腐蚀(Dilation and Erosion)

    膨胀和腐蚀被称为形态学操作。它们通常在二进制图像上执行,类似于轮廓检测。通过将像素添加到该图像中的对象的感知边界,扩张放大图像中的明亮白色区域。侵蚀恰恰相反:它...

    小飞侠xp
  • Genymotion安装及使用教程详解

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://www.devio.org) 一直以来都有不少朋友问我关于Android模拟器的事...

    CrazyCodeBoy

扫码关注云+社区

领取腾讯云代金券