2013-03-19 6 views
9

Каков наилучший способ оптимизации десериализации?Оптимизация десериализации Gson

В настоящее время я использую стандартные методы Gson.toJson и Gson.fromJson для сериализации и десериализации некоторых сложных объектов, и я хочу уменьшить время десериализации, если это возможно.

Самый сложный из моего объекта содержит 43 переменных, если это имеет значение.

ответ

13

Если вы хотите использовать Gson, а не переключиться на другой API Java-to/from-JSON, и если производительность автоматической записи данных Gson не будет достаточной, то можно остаться с Gson API, и выдавить некоторые умеренно лучшие показатели.

В последних раундах испытаний на производительность, опубликованных в https://github.com/eishay/jvm-serializers/wiki, результаты показывают, что комбинированные характеристики сериализации и десериализации Gson могут быть улучшены примерно на 25%, используя the streaming API of Gson вместо привязки данных.

Обратите внимание, что это в целом значительно усложняет реализацию кода пользователя, где решения, сопоставимые с однострочными каналами с использованием API привязки данных, например, new Gson().toJson(something), заменяются (легко) десятками строк, включая петли и условные обозначения. Таким образом, стоимость улучшенной производительности - более сложный код.

Примеры использования API потоковой передачи по сравнению с API привязки данных см. В реализациях JsonGsonManual и JsonGsonDatabind, в the jvm-serializers project.

(Примечание: в API-интерфейсе Gson также можно использовать древовидную структуру вместо API-интерфейсов потоковой передачи или привязки данных, но, по-видимому, он не предлагает каких-либо улучшений производительности по сравнению с привязкой данных. Например, см. JsonGsonTree.)

3

Невозможно улучшить сериализацию и десериализацию библиотеки Gson.

Как программист Брюс сказал, что если время выполнения действительно имеет значение для вас, взгляните на библиотеку Jackson. По-моему, это немного более «сложно», но оно оказалось намного быстрее, чем любые другие библиотеки json в тестах.

Here - некоторые из лучших практик для улучшения выступлений с Джексоном.

+2

Согласовано (очевидно). Я бы добавил, что, хотя параметры конфигурации с Jackson обширны и значительно более значительны, чем те, которые доступны в Gson API, для простого использования карт между структурами данных, требующими минимальной пользовательской обработки, Джексон, как и Gson, обеспечивает простой линейное решение. –

3

Gson известен и используется для простоты использования. Если вам нужна скорость, вам придется взглянуть на супер популярного Джексона Джсона.

Я тестировал и сравнивал как Gson, так и Jackson, и я могу сказать вам, что в некоторых случаях Джексон в 15 раз быстрее и сериализации, и десериализации, даже на очень больших объектах.

Чтобы получить подобное поведение как Json я использую следующие настройки

public enum JsonMapper { 
    INSTANCE; 

    private final ObjectMapper mapper; 

    private JsonMapper() { 
     mapper = new ObjectMapper(); 
     VisibilityChecker<?> visibilityChecker = mapper.getSerializationConfig().getDefaultVisibilityChecker(); 
     mapper.setVisibilityChecker(visibilityChecker 
       .withFieldVisibility(Visibility.ANY) 
       .withCreatorVisibility(Visibility.NONE) 
       .withGetterVisibility(Visibility.NONE) 
       .withSetterVisibility(Visibility.NONE) 
       .withIsGetterVisibility(Visibility.NONE)); 
    } 

    public ObjectMapper mapper() { 
     return mapper; 
    } 
} 

Это получится дать те же самые JSon строки как Gson для одних и тех же объектов. Вы можете настроить его, чтобы использовать только геттеры и сеттеры, если хотите. Я бы посоветовал вам прочитать обо всех аннотациях Jackson json для обработки подтипов (полезно для систем RPC-стиля).

Мои варианты использования: я использую jackson как сериализацию, когда мне нужно сохранять капли в системах хранения (Redis, Cassandra, Mongo, ... иногда mysql тоже). Я также использую его как сериализацию для своих API-интерфейсов RPC для довольно высоких систем трафика, хотя я предпочитаю использовать Protobuf для тех, когда это возможно. В этом последнем случае я использую Jackson для непосредственного сериализации в байт [] или поток для повышения производительности.

Последнее примечание. Объект mapper является потокобезопасным и имеет один статический экземпляр, как в примере, который я только что представил, не позволит вам получить небольшие накладные расходы.

EDIT: Я знаю, что мой пример не соответствует многим рекомендациям, указанным на странице Jackson, но он позволяет мне иметь простой для понимания код, который выглядит как Gson.toJson и Gson.fromJson (который я начал с тоже и включил позже Джексон)

Gson.toJson(object) =>JsonMapper.INSTANCE.mapper().writeValueAsString(object) Gson.fromJson(object, clazz) =>JsonMapper.INSTANCE.mapper().readValue(jsonString, clazz);

0

Огромный материал, который имеет значение в оптимизации для JSON, чтобы сохранить все данные в только одном уровне.

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

Джексон и Гсон продолжают быть лучшей библиотекой, которая поможет вам.

Смежные вопросы