fastjson 反序列化时传new ParameterizedType()会导致OOM

nnt7mjpx  于 2021-11-27  发布在  Java
关注(0)|答案(0)|浏览(348)

我们有这样的需求,在一个组件中,将泛型转为一种自定义的中间类型:JavaType,目的是提供抽象的数据转换器。
该组件默认提供的json转换器有gson、jackson两种。

有其它项目使用这个基础组件,但这些项目有的是用的自己实现的数据转换器,使用的是fastjson,这些项目运行一段时间后出现oom。我们发现是因为每次反序列化时,都创建一个java.lang.reflect.ParameterizedType导致的。

排查原因发现,gson与jackson两种工具在缓存实现上都实现了equals,而fastjson相当于是使用==。

gson缓存key比较使用了equals,实现如下:

@Override public final boolean equals(Object o) {
    return o instanceof TypeToken<?>
        && $Gson$Types.equals(type, ((TypeToken<?>) o).type);
  }

而fastjson没有使用equals:
写:

this.deserializers.put(java.lang.reflect.type, deserializer);

读:

return (ObjectDeserializer)this.deserializers.get(java.lang.reflect.type);

因此提下建议,是否改为equals更合适?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题