Учитывая производительность, как мне получить ObjectWriter для сериализации POJO в JSON? - PullRequest
1 голос
/ 12 марта 2019

com.fasterxml.jackson.databind.ObjectMapper JavaDocs скажем:

Экземпляры Mapper полностью поточнобезопасны при условии, что ВСЕ конфигурация экземпляра происходит до ЛЮБЫХ вызовов чтения или записи. Если конфигурация экземпляра картографа изменяется после первого использования, изменения могут вступать или не вступать в силу, и конфигурация вызывает себя может потерпеть неудачу. Если вам нужно использовать другую конфигурацию, у вас есть два Основные возможности:

Создание и использование ObjectReader для чтения, ObjectWriter для записи. Оба типа полностью неизменны, и вы можете свободно создавать новые экземпляры с другой конфигурацией с использованием любых заводских методов ObjectMapper или сами читатели / писатели. Строительство нового ObjectReaders и ObjectWriters - очень легкая операция, поэтому обычно целесообразно создавать их по мере необходимости, для настройки таких вещей, как необязательный отступ JSON.

Можно ли делать этот вызов каждый раз, когда мне нужен новый ObjectWriter?

jsonString = new MyObjectWriter().objectWriter().writeValueAsString(myPojo);

Где MyObjectWriter выглядит так:

public class MyObjectWriter {
    public ObjectWriter objectWriter()
    {
        return new ObjectMapper()
                .writer()
                .with(SerializationFeature.INDENT_OUTPUT)
                .with(JsonGenerator.Feature.IGNORE_UNKNOWN);
    }
}

Должен ли я держаться за копию ObjectMapper? ObjectWriter?

1 Ответ

1 голос
/ 12 марта 2019

Как в документации сказано, что это действительно дешевая операция, и вы можете сделать это «на основе вызова». Посмотрим, что у нас за каждым методом.

  • ObjectMapper.writer - создает новый ObjectWriter, используя SerializationConfig из ObjectMapper.
  • ObjectWriter.with - создает новый ObjectWriter на основе экземпляра caller плюс новую функцию, которая должна быть включена. Если данная функция уже включена, возвращается тот же экземпляр. Если функция изменяет конфигурацию - создается и возвращается новый ObjectWriter.

Давайте посмотрим пример приложения, которое показывает данный сценарий:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.util.Collections;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        ObjectWriter writer0 = mapper.writer();
        ObjectWriter writer1 = writer0.with(SerializationFeature.INDENT_OUTPUT);
        ObjectWriter writer2 = writer1.with(SerializationFeature.INDENT_OUTPUT);
        ObjectWriter writer3 = writer2.with(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);

        Map<String, Long> map = Collections.singletonMap("key", 123L);
        System.out.println(writer0 + " = " + writer0.writeValueAsString(map));
        System.out.println(writer1 + " = " + writer1.writeValueAsString(map));
        System.out.println(writer2 + " = " + writer2.writeValueAsString(map));
        System.out.println(writer3 + " = " + writer3.writeValueAsString(map));


        ObjectMapper mapper1 = new ObjectMapper();
        mapper1.enable(SerializationFeature.INDENT_OUTPUT);
        mapper1.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);

        ObjectWriter writer4 = mapper1.writer();
        System.out.println(writer4 + " = " + writer4.writeValueAsString(map));
    }
}

Над отпечатками приложений:

com.fasterxml.jackson.databind.ObjectWriter@2ed94a8b = {"key":123}
com.fasterxml.jackson.databind.ObjectWriter@2a5ca609 = {
  "key" : 123
}
com.fasterxml.jackson.databind.ObjectWriter@2a5ca609 = {
  "key" : 123
}
com.fasterxml.jackson.databind.ObjectWriter@20e2cbe0 = {
  "key" : "123"
}

com.fasterxml.jackson.databind.ObjectWriter@68be2bc2 = {
  "key" : "123"
}

Обратите внимание, что второй (writer1) и третий (writer2) экземпляры (com.fasterxml.jackson.databind.ObjectWriter@2a5ca609) одинаковы. Они также генерируют такую ​​же JSON полезную нагрузку.

Итак, используя первый экземпляр ObjectMapper, мы создали и настроили ObjectWriter. Но в основном используется только последний. Все промежуточное уже ушло и ждите сбора к GC. Там нет смысла делать это. Лучше создать экземпляр ObjectMapper, настроить его и создать уже настроенный ObjectWriter, вызвав метод writer(). Вы можете создать Factory -подобный класс для сконфигурированных экземпляров ObjectMapper и использовать эти экземпляры для генерации ObjectWriter -s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...