我正在实现使用分布式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。
@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是否会使我的解决方案更好。
我的目标是节省空间并提高性能。欢迎任何建议使我朝正确的方向发展。谢谢
不知道kryo是否真的能够写那些JSON节点。我认为有多种可能的选择:
您将继续使用kryo,但这意味着您应该将对象读取和写入为单独的值,而不是可以使用构造函数参数重新创建JsonNode实例。
如果您仍然要编写独立的值,则可能需要将这些值直接写入ObjectDataOutput并使用ObjectDataInput读取它
从我的观点来看,最好的方法是使用Jackson-您可能想看看CBOR数据格式,该格式是二进制的,非常简洁,可直接用于Jackson-此外,您不会松散JSON的无模式,动态特性(https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句