Подтвердить что ты не робот

Как правильно использовать Jackson ObjectMapper?

Я доволен тем, как ObjectMapper работает и используется в моем приложении. Что я хотел бы понять, это лучший способ реализовать ObjectMapper, чтобы обеспечить его повторное использование, и я не создаю ненужные экземпляры в своем приложении?

Мои мысли в том, что я могу объявить ObjectMapper в классе Utils следующим образом:

public class Utils {

    public final static ObjectMapper mapper = new ObjectMapper();

}

Затем я мог бы ссылаться на это из разных мест, которые мне нужны для использования кода, например:

JsonSimple jsonSimple = Utils.mapper.readValue(jsonString, JsonSimple.class);

Я столкнулся с этим другим вопросом (Должен ли я объявить ObjectMapper Jackson как статическое поле?), который вызвал мой подход. Я думаю, что, возможно, главное отличие заключается в том, что я хочу разделить экземпляр ObjectMapper на разных классах, а не только на одном классе.

Соответствует ли этот подход или я что-то упускаю?

Спасибо

4b9b3361

Ответ 1

Хорошо использовать один экземпляр для каждого приложения, если вы не вызываете какие-либо методы настройки после того, как он становится видимым, т.е. вы должны выполнить всю свою инициализацию внутри статического блока.

Ответ 2

Используйте последнюю версию Jackson и используйте ObjectReader и ObjectWriter вместо ObjectMapper

Ответ 3

Как указано в других ответах, ObjectMapper действительно является потокобезопасным. Но повторное использование одного и того же объекта может снизить производительность вашего приложения, так как все 1 потоки могут быть заблокированы в заданное время, ожидая, когда владелец блокировки завершит сериализацию/десериализацию JSON.

Это особенно важно для веб-серверов, таких как Jetty или Tomcat: общая производительность всего сервера может быть скомпрометирована, например, если вы используете Singleton ObjectMapper в качестве точки входа/выхода служб REST - в зависимости, конечно, при загрузке вашего доступа.

Итак, мое предложение состоит в том, чтобы использовать пул ObjectMappers, чтобы позволить нескольким потокам использовать его, и таким образом вам не нужно воссоздавать карты каждый раз, когда они вам понадобятся. Число в ObjectMappers в пуле должно быть равным числу рабочих потоков вашего приложения.

Подробнее о: http://jackson-users.ning.com/forum/topics/pooling-objectmapper-for-performance

- EDIT -

Хорошо, некоторые пользователи действительно увлечены Джексоном lib до такой степени, что они понижают этот ответ, даже не глядя на связанный веб-сайт. Во всяком случае, этот ответ основан на моем опыте работы с lib без каких-либо изменений (только с использованием ObjectMapper, без дополнительных классов, без пользовательского сериализатора, без пользовательского JSONFactory, ничего) во время ответа (2013). Я больше не использую его в своих проектах, поэтому я не знаю о более новых версиях, но думаю, он должен быть разрешен к настоящему времени.

Как разработчик, если вы собираетесь прямо или косвенно использовать Джексона или любого другого читателя/писателя JSON в своем проекте, попробуйте запустить инструмент профилирования на своем сервере, чтобы увидеть, как потоки ведут себя при высокой нагрузке. Это простой шаг, который не наносит вреда.

Ответ 4

Простой статический синглтон, предложенный вами в вашем вопросе, верен. Альтернативным подходом было бы использование шаблона singleton (использование одноэлементного шаблона подробно обсуждалось в комментариях к аналогичному вопросу). Вот простой пример:

public enum Mapper {
  INSTANCE;
  private final ObjectMapper mapper = new ObjectMapper();

  private Mapper(){
    // Perform any configuration on the ObjectMapper here.
  }

  public ObjectMapper getObjectMapper() {
    return mapper;
  }
}

Затем вы можете использовать (и повторно использовать) синглет ObjectMapper следующим образом:

ObjectMapper mapper = Mapper.INSTANCE.getObjectMapper();
JsonSimple jsonSimple = mapper.readValue(jsonString, JsonSimple.class);

Это безопасно, поскольку ObjectMapper поточно-безопасный после настройки.

Предостережение. Как указывает @StaxMan в комментариях к ответам, это НЕ гарантирует отсутствие дополнительной (повторной) конфигурации на возвращенном синглетоне.