java - Bean 访问器的 Genson 缓存

标签 java json caching genson

我最近升级到 Genson 1.3,我不能 100% 确定这个问题是否是新问题,因为之前我修补了 0.98 版本以使其正常工作。

上下文

我们正在使用我们自己的 BeanMutatorAccessorResolver 实现。这样我们就可以动态地决定属性是否应该被序列化。基本上,我们已将 Genson 集成到我们的通用 Jersey REST API 接口(interface)中。 Genson 负责所有的序列化和反序列化工作。当执行 GET 请求时,用户可以传递 URL 中的字段,以便过滤他特别需要的字段(特别是对于大型对象,这是必要的,因为您只需要 3 个左右的字段来显示表概述)。例如:?fields=field1, field2, field3。然后,我们在 BeanMutatorAccessorResolver 的实现中确切地知道要序列化哪些字段以及要忽略哪些字段。这主要是为了加快请求和解析速度,因为我们使用的数据较少。

问题

不幸的是,一旦 Genson 通过反射或其他方式读取了所有字段,它就会缓存它。如果我们总是请求相同的字段,这不会有问题。不幸的是,在某些情况下,我们需要比以前更多的字段,但由于 Genson 不会再次访问我们的 BeanMutatorAccessorResolver,因此它只返回已经缓存的少数字段。

还有这方面的事情吗?也许有比完全关闭缓存更好的解决方案 - 因为这很可能会损害性能,对吗?

更新

我似乎已经找到了发生这种情况的位置。基本上,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))) {

我应该设置这个值还是有更好的解决方案?

最佳答案

感谢 Eugen,问题已得到解决。解决方案可以在这里找到:https://groups.google.com/forum/#!topic/genson/Z1oFHJfA-5w .

基本上,您需要扩展 3 个类才能使其正常工作:

  1. GensonBundle,您可以使用 GensonBuilder 进行注册。
  2. BaseBeanDescriptorProvider,在 GensonBundle 中创建。
  3. BeanDescriptor,在 BaseBeanDescriptorProvider 中创建并 其中包含序列化方法来适应您的需求。

关于java - Bean 访问器的 Genson 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33735036/

相关文章:

python - 如何在 Python 脚本中参数化 JSON 对象

python - 在python中将字典写入文件

java - 合并循环中的冗余信息

java - Hibernate 中的一对多映射 - 错误

java - 如何在 Java 11 中调用 schemagen?

java - 如何将 json 代码获取到我的应用程序中

caching - 在 Glide 中查找并加载缓存的图像

php - 如何在 Memcache 或 Redis 中通过标签清除缓存?

java - 如何等待数据缓存更新,同时不影响其他缓存调用

java - View 添加到 ViewGroup 后不可见