你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

fastJSON_12_ SerializeFilter序列化过滤器分析

2021/12/26 23:48:55

2021SC@SDUSC

目录

 本篇介绍

用法示例

 源码分析

总结


 本篇介绍

在前面的内容中,我们了解了可以使用fastJSON提供的注解来定制我们的序列化反序列化对象,比如@JSONType,@JSONField,在此基础上,fastJSON还提供了一种帮助我们定制化序列化对象的接口,那就是序列化过滤器SerializeFilter接口.本篇将围绕该接口相关的fastJSON源码,继续讲解fastJSON的定制化操作.

用法示例

SerializeFilter是通过继承接口,自定义编程扩展的方式来定制序列化。fastjson支持6种SerializeFilter,用于不同场景的定制序列化。

  1. PropertyPreFilter 根据PropertyName判断是否序列化
  2. PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化
  3. NameFilter 修改Key,如果需要修改Key,process返回值则可
  4. ValueFilter 修改Value
  5. BeforeFilter 序列化时在最前添加内容
  6. AfterFilter 序列化时在最后添加内容

每次使用时,需要初始化并覆写其中的方法

filterName=new ***Filter(){

@override

//重写的方法

}

对应需要覆写的方法分别是:

  1. apply
  2. apply
  3. process
  4. process
  5. writeBefore
  6. writeAfter

比如,我们演示一下AfterFilter的使用

 最终的结果

 发现每一个Person类的JSON输出最后都添加了一个预先设置好的字段

 源码分析

 让我们回到JSON.writeJSONString()方法,

 发现主要是这个位置在获取序列化过滤器,我们发现,addFilter方法是属于JSONSerializer调用的,进入到该方法中,发现了大量的判断语句,对应着不同的过滤器的对应操作.

 我们仍然以AfterFilter为例,进入到该过滤器的执行语句.

if (filter instanceof AfterFilter) {
            this.getAfterFilters().add((AfterFilter) filter);
        }

首先,通过JSONSerializer调用getAfterFilters()

这个方法返回一个过滤器列表,如果没有过滤器,则重新创建一个该列表,然后我们继续看执行语句的后半部分,也就是将该过滤器添加到该过滤器列表当中了.所以在最后,我们只需要通过该列表来在输出时执行操作即可,该部分是在JavaBeanSerializer类当中的writeAfter方法里实现的,源码如下.

 这个方法最终又是调用了afterFilter的writeAfter方法

 在这个writeAfter方法中,我们发现它调用了最下面的重载的抽象方法writeAfter,也就是说我们在创建该对象时需要override的那个方法,而重载时我们正好由调用了其第二个方法writeKeyValue方法,而该方法又通过获取本线程的序列化器,然后让序列化器最终实现writeKeyValue方法,在输出流的末端添加分隔符和相应的key,value,从而达成目的.

 其他的过滤器大部分都是利用了这样的调用关系而实现了序列化的定制化.

总结

通过本次源码分析,我们发现,fastJSON不仅是作为一款功能强大的JSON序列化反序列化工具,而且还对序列化反序列化内容提供了高度可定制化的功能,不论是注解还是序列化过滤器,给我留下了非常深刻的印象,我也希望在日后我参与的项目中,能够通过注解或者接口的方式提供高度可定制化的内容.