【问题标题】:Hazelcast, Kryo, JsonNode SerializerHazelcast、Kryo、JsonNode 序列化器
【发布时间】:2016-10-18 04:33:13
【问题描述】:

我正在使用分布式 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 会使我的解决方案更好。

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

【问题讨论】:

    标签: jackson hazelcast kryo hazelcast-imap


    【解决方案1】:

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

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

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

    • 1234563 , JSON 的动态特性 (https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor)

    【讨论】:

    • 感谢 noctarius 的所有帮助。我认为 CBOR 将能够满足我的要求
    【解决方案2】:

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

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

    在您的情况下,我认为在处理 JSON 树(或通用树模型)时使用 Kryo 没有意义:Kryo 在使用 POJO 时效果最好,并且可以充分利用对结构的精确知识。树模型需要包含名称,这消除了 Kryo、Avro、Protobuf 和 Thrift 等格式原本具有的大小优势。

    【讨论】:

    • 感谢 StaxMan。我会看看微笑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多