Ganson缓存Bean访问器

时间:2015-11-16 12:09:48

标签: java json caching genson

我最近升级到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))) {

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

1 个答案:

答案 0 :(得分:1)

由于欧根,这个问题已经解决了。可以在此处找到解决方案:https://groups.google.com/forum/#!topic/genson/Z1oFHJfA-5w

基本上你需要扩展3个类来实现这个目的:

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