fastJSON源码分析_4_序列化器特征

本文详细分析了FastJSON中SerializerFeature的实现原理,包括枚举类的使用、序列化配置的安全性和效率提升。通过源码分析,解释了如何通过位运算判断配置项是否开启,以及如何通过位运算高效地添加或移除配置。FastJSON通过枚举类避免了使用int参数可能导致的错误,并利用位运算优化了配置处理速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021SC@SDUSC

 本篇简介

 在上一篇文章中我们浅析了对象序列化器的实现以及有关JavaBeanSerializer的创建,但是如果还要了解json字符串的生成细节,就得深入到SerializerWriter这个类的内容,因为所有的对象序列化器的write方法中都会使用到JSONSerializer作为参数,并且主要的目的是获取JSONSerializer所维护的SerializerWriter对象,然后实现输出.但是本篇先不急着去分析序列化输出器,我们介绍一下前面提到的SerializerFeature.

在前面已经简单介绍了序列化特征这个类的大概结构和功能,序列化特征相当于序列化输出的一个配置,我们可以通过更改或添加序列化特征来实现我们想要的输出效果.本篇将从源码的角度更深入地去分析该类.

使用示例

序列化特征一般是通过方法入参的方式来配置我们的方法,可以是单个也可以是多个配置(因为在方法中它是作为可变长参数出现的).

由于是枚举类,我们只需要在参数中使用类名调用枚举项就可以进行配置了.例如:

 

 这里就是使用了显示类名和json已读格式的配置,看看和普通输出的区别:

我们可以通过查阅配置项的说明或者通过其英文名称来知道这个配置项的效果.

这里可以参考一下​​​​​这篇讲序列化特征使用效果的文章:

fastjson SerializerFeature详解_孤天浪雨-优快云博客_serializerfeature

本篇内容我们将更加关注于该序列化特征的实现.

源码分析

关于其类型

首先,如果说让我这个初学者来写这样的配置,那可能就会使用静态常量来表示这些配置项,然后将方法改为writeJSONString(Object object,int... serializerFeatures)

 这样做确实比较方便,但是fastJSON却选择的是将SerializerFeature作为枚举类来实现这种配置功能.这样做的原因是什么呢,因为使用静态常量的话,方法实际上传入了一个int参数,这样就可能导致出现用户输入错误的参数的情况发生,也可能由于发生计算的情况导致参数类型错误,所以使用枚举类后,可以直接在方法中指定入参必须是序列化特征类中的枚举项,同时与int撇清了关系,解决了使用安全上的问题,同时也减少了代码量(省去一大串的修饰符和与功能无关的int值)

核心代码分析

先上图

 这里的ordinal()是枚举类的方法,表示的是每一个枚举项的序号,同类中声明枚举项的顺序相对应,从0开始,这里mask是作为一个变量,取名为遮罩是有其原因的,这将在后面讲到.这里的mask得到是一个2的n次方的数,表示为二进制就刚好为1,10,100,...

再接着往下看:

这个方法可以猜测,是为了判断该配置项是否开启的一个方法,而方法的内容会有点让人疑惑,features代表的是什么,为什么还要做一个计算?

&是表示位运算中的与运算,比如3和5做与运算:

3:0000 0000 0000 0011 &

8:0000 0000 0000 0101 =>

1:0000 0000 0000 0001

原来如此,这里的features其实就是指的所有的features,每一个feature的状态在其中占着一位,而是哪一位则由SerializerFeature的ordinal顺序所决定,比如我们的一个feature(QuoteFieldNames),在枚举类的顺序为第一位,所以得到它的mask为1,而现在我们初始化我们的feature配置为一个数字9,即二进制表示为1001,当我们去判断该配置是否开启时,将两者传入isEnable方法,如果features的最后一位为1,则作与运算后必然会的到1,结果不为0,从而达到检测的目的.这个mask的目的就是相当于枚举类的一个识别面罩,方便用于运算.

知道feature的运作方式后,我们再回过头看writeJSONString方法,当我们不去安排features的时候,我们使用了fastJSON提供的默认生成特征,

DEFAULT_GENERATE_FEATURE

 

 

 这个变量的初始化在JSON的静态代码块中,这里我们看到了正在使用另外的位运算方法,或运算|

很明显,当0和1进行或运算时得到的是1,可以用来将所需要的特征添加到features当中,相应的,如果想要取消某特征则可以通过减法或者异或运算来实现.

总结

总而言之,通过对源码的分析,我们终于了解到了序列化特性的实现细节,首先是使用了枚举类,解决了使用安全上的问题,同时使用了mask技术,将配置用二进制的方式展现出来,节约了内存空间,同时,由于计算机对于位运算的效率要远高于普通运算,所以又提升了配置处理速度,现在我们就对fastJSON的"快"有了一个初步的认识了.

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值