我正在使用分布式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会使我的解决方案更好。
我的目标是节省空间并提高性能。 欢迎任何建议让我朝着正确的方向前进。 感谢
答案 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等格式带来的大小优势。