1

エントリとして分散 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);
}

ただし、スペースを節約してパフォーマンスを向上させるために、JsonNodeReader/Writer を使用しないように Kryo を使用したいと考えました。

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 を使用する私のアプローチが最適かどうか、または Kry を使用すると私のソリューションが改善されるかどうかはわかりません。

私の目標は、スペースを節約してパフォーマンスを向上させることです。私を正しい方向に導くために、どんな提案も大歓迎です。ありがとう

4

2 に答える 2

4

kryo が実際にこれらの JSON ノードを書き込めるかどうかは不明です。複数の可能なオプションがあると思います:

  • kryo を使用しますが、コンストラクターのパラメーターを使用して JsonNode インスタンスを再作成するよりも、オブジェクトを個別の値として読み書きする必要があります。

  • とにかく独立した値を書き込む場合は、値を直接 ObjectDataOutput に書き込み、ObjectDataInput を使用して読み取ることができます。

  • 私の視点からは、Jackson を使用するのが最善の方法です。バイナリであり、非常に簡潔で、Jackson で直接利用できる CBOR データ形式を調べてください。さらに、JSON のスキーマレスで動的な性質を失うことはありません ( https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor )

于 2016-10-18T05:51:51.963 に答える
3

@noctarius による良い点と提案に加えて、Smile と呼ばれる CBOR 以外の別のバイナリ JSON 代替手段があります。同じバイナリ データ形式モジュールから見つかりました:

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

あなたの場合、JSONツリー(または一般的なツリーモデル)を扱っている場合、Kryoの使用は意味がないと思います.KryoはPOJOを使用するときに最適に機能し、構造の正確な知識を最大限に活用できます. ツリー モデルには名前を含める必要があるため、Kryo、Avro、Protobuf、Thrift などの形式が持つサイズのメリットがなくなります。

于 2016-10-18T18:13:55.850 に答える