Hazelcast, Kryo, сериализатор JsonNode

Я реализую приложение Hazelcast, используя распределенную карту MAP в качестве записи. Мой 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 улучшит мое решение.

Моя цель — сэкономить место и повысить производительность. Любые предложения приветствуются, чтобы поставить меня в правильном направлении. Спасибо


person phoenix    schedule 18.10.2016    source источник


Ответы (2)


Не уверен, что крио действительно может писать эти узлы JSON. Я думаю, что есть несколько возможных вариантов:

  • Вы остаетесь с крио, но это означает, что вы должны читать и записывать объекты как отдельные значения, чем вы можете воссоздать экземпляры JsonNode с параметрами конструктора.

  • Если вы все равно собираетесь писать независимые значения, вы можете записать значения непосредственно в ObjectDataOutput и прочитать их с помощью ObjectDataInput.

  • С моей точки зрения, лучший способ — использовать Джексона — возможно, вы захотите взглянуть на формат данных CBOR, который является двоичным, очень кратким и напрямую доступен для Джексона — кроме того, вы не потеряете бессхемный, динамический характер JSON ( https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor)

person noctarius    schedule 18.10.2016
comment
Спасибо noctarius за вашу помощь. Я думаю, что CBOR сможет удовлетворить мои требования - person phoenix; 30.10.2016

В дополнение к хорошим замечаниям и предложениям @noctarius, помимо CBOR, есть еще одна бинарная альтернатива JSON под названием Smile. Найдено из того же модуля двоичных форматов данных:

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

В вашем случае я не думаю, что использование Kryo имеет смысл, если и когда вы имеете дело с деревом JSON (или общими моделями деревьев): Kryo лучше всего работает при использовании POJO и может в полной мере использовать точное знание структур. Древовидные модели требуют включения имен, что устраняет преимущества размера, которые в противном случае имеют такие форматы, как Kryo, Avro, Protobuf и Thrift.

person StaxMan    schedule 18.10.2016
comment
Спасибо Стаксман. Я посмотрю Смайл. - person phoenix; 30.10.2016