Hazelcast、Kryo、JsonNode 序列化程序
Hazelcast, Kryo, JsonNode Serializer
我正在使用分布式 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 来节省一些 space 并提高性能。
我尝试使用 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 会使我的解决方案更好。
我的目标是节省 space 并提高性能。
欢迎提出任何建议,让我朝着正确的方向前进。
谢谢
不确定 kryo 是否真的能够写入那些 JSON 节点。我认为有多种可能的选择:
你继续使用 kryo,但这意味着你应该将对象作为单独的值进行读写,而不是用构造函数参数重新创建 JsonNode 实例
如果你无论如何都要写独立的值,你可能想将值直接写入 ObjectDataOutput 并使用 ObjectDataInput
读取它
从我的观点来看,最好的方法是使用 Jackson——你可能想看看 CBOR 数据格式,它是二进制的,非常简洁,可直接用于 Jackson——此外你不会不要失去 JSON (https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor)
的无模式、动态特性
除了@noctarius 的优点和建议之外,除了 CBOR 之外,还有另一个二进制 JSON 替代方案,称为 Smile。从相同的二进制数据格式模块中找到:
https://github.com/FasterXML/jackson-dataformats-binary
在你的情况下,如果你正在处理 JSON 树(或一般树模型),我认为使用 Kryo 没有意义:Kryo 在使用 POJO 时效果最好,并且可以充分利用准确的结构知识。树模型需要包含名称,这消除了 Kryo、Avro、Protobuf 和 Thrift 等格式原本具有的大小优势。
我正在使用分布式 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 来节省一些 space 并提高性能。
我尝试使用 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 会使我的解决方案更好。
我的目标是节省 space 并提高性能。 欢迎提出任何建议,让我朝着正确的方向前进。 谢谢
不确定 kryo 是否真的能够写入那些 JSON 节点。我认为有多种可能的选择:
你继续使用 kryo,但这意味着你应该将对象作为单独的值进行读写,而不是用构造函数参数重新创建 JsonNode 实例
如果你无论如何都要写独立的值,你可能想将值直接写入 ObjectDataOutput 并使用 ObjectDataInput
读取它
从我的观点来看,最好的方法是使用 Jackson——你可能想看看 CBOR 数据格式,它是二进制的,非常简洁,可直接用于 Jackson——此外你不会不要失去 JSON (https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor)
的无模式、动态特性
除了@noctarius 的优点和建议之外,除了 CBOR 之外,还有另一个二进制 JSON 替代方案,称为 Smile。从相同的二进制数据格式模块中找到:
https://github.com/FasterXML/jackson-dataformats-binary
在你的情况下,如果你正在处理 JSON 树(或一般树模型),我认为使用 Kryo 没有意义:Kryo 在使用 POJO 时效果最好,并且可以充分利用准确的结构知识。树模型需要包含名称,这消除了 Kryo、Avro、Protobuf 和 Thrift 等格式原本具有的大小优势。