我最近升级到Genson 1.3,但我不能100%确定这个问题是否是新的,因为我之前为0.98版本打了补丁以使其正常工作。
语境
我们正在使用我们自己的BeanMutatorAccessorResolver实现。这样,我们就可以动态决定是否应序列化属性。基本上,我们已经将Genson集成到了我们的通用球衣REST API接口中。 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))) {
我应该设置这个值还是有更好的解决方案?
最佳答案
由于有了欧根,这个问题已经解决了。解决方案可以在这里找到:https://groups.google.com/forum/#!topic/genson/Z1oFHJfA-5w。
基本上,您需要扩展3个类才能使其工作:
GensonBundle,您可以在GensonBuilder中注册。
在GensonBundle中创建的BaseBeanDescriptorProvider。
BeanDescriptor,在BaseBeanDescriptorProvider和
其中包含可满足您需求的序列化方法。