我正在尝试使用jackson序列化/反序列化一组对象,包括子类。我正在使用JsonTypeInfo和JsonSubTypes注释。它可以很好地使用DynamoDB,但我也尝试使用Redis缓存(通过spring的redis组件)。它写入redis很好,但在尝试从redis中检索时出现以下错误:
无法将类型ID“LinkedTreeMap”解析为[simple type,myBaseClass]的子类型:已知类型ids = [myBaseClass,sub-class1,sub-class1 ...] ...通过参考链....-> [MyBaseClass的集合] - > java.util.ArrayList [0] ......
我认为LinkedTreeMap位于gson库中。我们有一个非常大的maven项目,由于其他库依赖项,gson在那里,但我不知道它是如何或为什么被引入这种用法。它看起来像是基于json的结构派生这个类。它试图反序列化的Json看起来像是列表而不是地图。
那么这个LinkedTreeMap来自哪里?
我们还使用以下ObjectMapper进行redis:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd\'T\'HH:mm:ss.SSSZ"));
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.registerModule(new JodaModule());
我们还使用实现RedisSerializer的自定义序列化程序。您可能认为这可能是第一个寻找这样的问题的地方,但它很少,并且在您使用Spring @Bean自动装配RedisTemplate时似乎是必要的。