Hazelcast,Kryo,JsonNode Serializer

时间:2016-10-18 04:33:13

标签: jackson hazelcast kryo hazelcast-imap

我正在使用分布式MAP作为条目实现Hazelcast应用程序。我的JsonNodeSerializer如下所示

private final ObjectReader jsonNodeReader;
private final ObjectWriter jsonNodeWriter;

@Override
public void write(ObjectDataOutput out, JsonNode jsonNode)
        throws IOException {
    out.write(jsonNodeWriter.writeValueAsBytes(jsonNode));
}

@Override
public JsonNode read(ObjectDataInput in)
        throws IOException {
    return jsonNodeReader.readTree(in);
}

但是,我想使用Kryo来避免使用JsonNodeReader / Writer来节省一些空间并提高性能。

我尝试使用Kryo并且我无法读取JsonNode / ObjectNode,因为我们没有no-args构造函数。

@Override
public void write(ObjectDataOutput out, JsonNode jsonNode)
        throws IOException {
    Kryo kryo = KRYO_THREAD_LOCAL.get();
    Output output = new Output((OutputStream) out);
    kryo.writeObject(output, jsonNode);
    output.flush();

    //out.write(jsonNodeWriter.writeValueAsBytes(jsonNode));
}

@Trace(dispatcher = true)
@Override
public JsonNode read(ObjectDataInput in)
        throws IOException {
    InputStream inputStream = (InputStream) in;
    Input input = new Input(inputStream);
    Kryo kryo = KRYO_THREAD_LOCAL.get();
    return kryo.readObject(input, ObjectNode.class);
   // return jsonNodeReader.readTree(in);
} 

不确定我使用JsonNodeReader / Writer的方法是否最佳,或者使用Kryo会使我的解决方案更好。

我的目标是节省空间并提高性能。 欢迎任何建议让我朝着正确的方向前进。 感谢

2 个答案:

答案 0 :(得分:3)

不确定kryo是否真的能够编写这些JSON节点。我认为有多种可能的选择:

  • 您仍然使用kryo,但这意味着您应该将对象作为单独的值读取和写入,而不是使用构造函数参数重新创建JsonNode实例

  • 如果您仍然要写独立值,您可能希望将值直接写入ObjectDataOutput并使用ObjectDataInput

  • 读取它
  • 从我的pov开始,最好的方法就是使用杰克逊 - 你可能想看看CBOR数据格式,它是二进制的,非常简洁并可直接用于杰克逊 - 此外你不会松散无模式,JSON的动态特性(https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor

答案 1 :(得分:3)

除了@noctarius提出的好点和建议之外,还有另一个除了CBOR之外的二元JSON替代方案,名为Smile。从相同的二进制数据格式模块中找到:

https://github.com/FasterXML/jackson-dataformats-binary

在你的情况下,我不认为在你处理JSON树(或一般树模型)的时候使用Kryo是有意义的:Kryo在使用POJO时效果最好,并且可以充分利用结构的确切知识。树模型需要包含名称,这样可以消除Kryo,Avro,Protobuf和Thrift等格式带来的大小优势。