Kin*_*isG 5 java json fasterxml redisson
我目前正在尝试将Redisson作为Redis客户端,到目前为止,我已经能够成功替换大量代码。我现在遇到的唯一问题是尝试使用分布式集合,例如Queue或List。
List<MyEntry> entries = // read some sample data from a file
RedissonClient client = // create client
RBlockingQueue<MyEntry> queue = client.getBlockingQueue("test-queue", new JsonJacksonCodec());
queue.addAll(entries);
List<MyEntry> readBack = new ArrayList<>();
queue.drainTo(readBack);
Run Code Online (Sandbox Code Playgroud)
当我到达最后一行时,我总是会遇到此异常-
com.fasterxml.jackson.databind.exc.InvalidTypeIdException:尝试解析[简单类型,类java.lang.Object]的子类型时缺少类型ID:[源:(io.netty。 buffer.ByteBufInputStream); 行:1,列:1439]
当我将@JsonTypeInfo添加到类中时,它似乎可以工作,但是,大多数我无权将@JsonTypeInfo注释添加到的类。
我在这里想念什么吗?解决此问题的一种方法可能是使用ByteArrayCodec并使用我自己的ObjectMapper进行序列化/反序列化(编辑:尝试这样做会引发另一种异常!),但如果可能的话,我宁愿让Redisson处理此问题,因为它提供了许多编解码器已经。
与往常一样,任何帮助都将不胜感激!
更多信息-我最终编写了自己的简单编解码器,该编解码器仅将Class作为参数,并创建了Decoder和Encoder,其工作方式与JsonJacksonCodec的工作方式相似,但有一个区别-
private static class MyCodec<T> implements Codec {
private final Decoder<Object> decoder = new Decoder<Object>() {
@Override
public T decode(ByteBuf buf, State state) throws IOException {
return mapper.readValue((InputStream) new ByteBufInputStream(buf), type);
}
};
private final ObjectMapper mapper = new ObjectMapper(new MessagePackFactory());
private final Class<T> type;
public MyCodec(Class<T> type) {
this.type = type;
}
// rest of methods...
}
Run Code Online (Sandbox Code Playgroud)
而且我能够使我的示例正常工作-但这听起来像是一种解决方法,而不是原始问题的解决方案,并且我不想为我拥有的每个实现编写其他编解码器:)
Redisson 为未使用 Jackson 注解进行注解的类提供了默认的 Jackson 编解码器。您现有的注释优先于默认编解码器设置,因此出现了问题。您可以尝试其他类型的编解码器,例如 fst 编解码器,或向 Jackson 编解码器提供您自己的兼容对象映射器。
| 归档时间: |
|
| 查看次数: |
2257 次 |
| 最近记录: |