我最近升级到 Genson 1.3,我不能 100% 确定这个问题是否是新问题,因为之前我修补了 0.98 版本以使其正常工作。
语境
我们正在使用我们自己的 BeanMutatorAccessorResolver 实现。这样我们就可以动态地决定一个属性是否应该被序列化。基本上,我们已将 Genson 集成到我们的通用球衣 REST API 接口中。Genson 做了所有的序列化和反序列化。在执行 GET 请求时,用户可以在 URL 中传递字段以过滤他特别需要的字段(特别是对于大型对象,当您只需要 3 个左右的字段来显示表格概览时,这是必要的)。例如:?fields=field1, field2, field3。然后,我们在 BeanMutatorAccessorResolver 的实现中确切地知道要序列化哪些字段以及要忽略哪些字段。这主要是为了加快请求和解析,因为我们使用的数据更少。
问题
不幸的是,似乎一旦 Genson 通过反射或其他方式读取了所有字段,它就会缓存它。如果我们总是请求相同的字段,这将没有问题。不幸的是,在某些情况下,我们需要比以前更多的字段,但是因为 Genson 没有第二次访问我们的 BeanMutatorAccessorResolver,它只返回它已经缓存的少数字段。
有没有办法解决?也许有比完全关闭cahing更好的解决方案——因为这很可能会损害性能,对吧?
更新
似乎我找到了发生这种情况的位置。基本上,Genson 在 Genson.provideConverter(Type forType) (第 154 行)中返回一个缓存的转换器。
Converter<T> converter = (Converter<T>) converterCache.get(forType);
在该方法的顶部,我注意到它会查找 __GENSON$DO_NOT_CACHE_CONVERTER。
if (Boolean.TRUE.equals(ThreadLocalHolder.get("__GENSON$DO_NOT_CACHE_CONVERTER", Boolean.class))) {
我应该设置这个值还是有更好的解决方案?