Redisson和Json的对象

时间:2017-08-28 20:19:07

标签: java json fasterxml redisson

我目前正在尝试Redisson作为Redis客户端,到目前为止,我已经能够毫无问题地替换大量代码。我现在唯一的问题是尝试使用分布式集合,例如队列或列表。

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);

当我到达最后一行时,我总是得到这个例外 -

  

com.fasterxml.jackson.databind.exc.InvalidTypeIdException:尝试解析[simple type,class java.lang.Object]的子类型时缺少类型id:缺少类型id属性&#39; @class&#39;    在[来源:(io.netty.buffer.ByteBufInputStream); line:1,column: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...
}

我能够让我的示例正常工作 - 但这感觉就像是一种解决方法,而不是原始问题的解决方案,而且我不想为每个实现编写额外的编解码器:)

2 个答案:

答案 0 :(得分:2)

Redisson为未使用Jackson注释注释的类提供默认的Jackson编解码器。您现有的注释优先于默认编解码器设置,因此存在问题。您可以尝试其他类型的编解码器,如fst编解码器,或者为Jackson编解码器提供您自己的兼容对象mappper。

答案 1 :(得分:0)

请参见Fundamental API design flaw -- with respect to encoding and serialization

我非常想错。当前正在寻找一种无需大手术即可解决的方法。