别了,阿里巴巴fastjson!企业项目迁移Gson全攻略( 二 )

性能对比同事撰写的性能对比源码:
https://github.com/zysrxx/json-comparison
【别了,阿里巴巴fastjson!企业项目迁移Gson全攻略】本文不详细讨论性能的差异,毕竟这其中涉及了很多各个框架的实现思路和优化,所以只给出结论:

1.序列化单对象性能Fastjson > Jackson > Gson,其中Fastjson和Jackson性能差距很小,Gson性能较差
2.序列化大对象性能Jackson> Fastjson > Gson,序列化大Json对象时Jackson> Gson > Fastjson,Jackson序列化大数据时性能优势明显
3.反序列化单对象性能 Fastjson > Jackson > Gson , 性能差距较小
4.反序列化大对象性能 Fastjson > Jackson > Gson , 性能差距较很小
最终选择方案
  • Jackson适用于高性能场景,Gson适用于高安全性场景
  • 对于新项目仓库,不再使用fastjson 。对于存量系统,考虑到Json更换成本,由以下几种方案可选: 项目未使用autoType功能,建议直接切换为非fastjson,如果切换成本较大,可以考虑继续使用fastjson,关闭safemode 。业务使用了autoType功能,建议推进废弃fastjson 。
替换依赖注意事项企业项目或者说大型项目的特点:
  • 代码结构复杂,团队多人维护 。
  • 承担重要线上业务,一旦出现严重bug会导致重大事故 。
  • 如果是老项目,可能缺少文档,不能随意修改,牵一发而动全身 。
  • 项目有很多开发分支,不断在迭代上线 。
所以对于大型项目,想要做到将底层的fastjson迁移到gson是一件复杂且痛苦的事情,其实对于其他依赖的替换,也都一样 。
我总结了如下几个在替换项目依赖过程中要特别重视的问题 。
谨慎,谨慎,再谨慎再怎么谨慎都不为过,如果你要更改的项目是非常重要的业务,那么一旦犯下错误,代价是非常大的 。并且,对于业务方和产品团队来说,没有新的功能上线,但是系统却炸了,是一件“无法忍受”的事情 。尽管你可能觉得很委屈,因为只有你或者你的团队知道,虽然业务看上去没变化,但是代码底层已经发生了翻天覆地的变化 。
所以,谨慎点!
做好开发团队和测试团队的沟通在依赖替换的过程中,需要做好项目的规划,比如分模块替换,严格细分排期 。
把前期规划做好,开发和测试才能有条不紊的进行工作 。
开发之间,需要提前沟通好开发注意事项,比如依赖版本问题,防止由多个开发同时修改代码,最后发现使用的版本不同,接口用法都不同这种很尴尬,并且要花额外时间处理的事情 。
而对于测试,更要事先沟通好 。一般来说,测试不会太在意这种对于业务没有变化的技术项目,因为既不是优化速度,也不是新功能 。但其实迁移涉及到了底层,很容易就出现BUG 。要让测试团队了解更换项目依赖,是需要大量的测试时间投入的,成本不亚于新功能,让他们尽量重视起来 。
做好回归/接口测试上面说到测试团队需要投入大量工时,这些工时主要都用在项目功能的整体回归上,也就是回归测试 。
当然,不只是业务回归测试,如果有条件的话,要做接口回归测试 。
如果公司有接口管理平台,那么可以极大提高这种项目测试的效率 。
打个比方,在一个模块修改完成后,在测试环境(或者沙箱环境),部署一个线上版本,部署一个修改后的版本,直接将接口返回数据进行对比 。一般来说是Json对比,网上也有很多的Json对比工具:
https://www.sojson.com/
考虑迁移前后的性能差异正如上面描述的Gson和Fastjson性能对比,替换框架需要注意框架之间的性能差异,尤其是对于流量业务,也就是高并发项目,响应时间如果发生很大的变化会引起上下游的注意,导致一些额外的后果 。
使用Gson替换Fastjson这里总结了两种json框架常用的方法,贴出详细的代码示例,帮助大家快速的上手Gson,无缝切换!
Json反序列化String jsonCase = "[{"id":10001,"date":1609316794600,"name":"小明"},{"id":10002,"date":1609316794600,"name":"小李"}]";// fastjsonJSONArray jsonArray = JSON.parseArray(jsonCase);System.out.println(jsonArray);System.out.println(jsonArray.getJSONObject(0).getString("name"));System.out.println(jsonArray.getJSONObject(1).getString("name"));// 输出:// [{"date":1609316794600,"name":"小明","id":10001},{"date":1609316794600,"name":"小李","id":10002}]// 小明// 小李// GsonJsonArray jsonArrayGson = gson.fromJson(jsonCase, JsonArray.class);System.out.println(jsonArrayGson);System.out.println(jsonArrayGson.get(0).getAsJsonObject().get("name").getAsString());System.out.println(jsonArrayGson.get(1).getAsJsonObject().get("name").getAsString());// 输出:// [{"id":10001,"date":1609316794600,"name":"小明"},{"id":10002,"date":1609316794600,"name":"小李"}]// 小明// 小李


推荐阅读