Connect with us

Разработка

Protobuf против JSON для Android-разработки

И JSON, и Protobuf могут выполнить свои задачи, но Protobuf предлагает неоспоримые преимущества перед JSON ценой немного более сложной настройки.

Опубликовано

/

     
     

Введение

Как Android-разработчики мы часто получаем данные от веб-сервисов. JSON — это король, он широко распространен и везде хорошо поддерживается.
Но постепенно я вижу, как Protobuf набирает обороты. В этой статье вы узнаете, что такое Protobuf и какие преимущества имеет Protobuf по сравнению с JSON. Давайте начнем.

Что такое Protobuf

Protobuf — это сокращение от Protocol Buffer. Это независимый от языка и платформы механизм для сериализации структурированных данных. Он используется для взаимодействия между гетерогенными системами, такими как клиент и сервер.

Protobuf разработан как компактный и эффективный механизм. Это делает его идеальным для приложений, где пропускная способность или производительность являются критическими проблемами.

В Protobuf применяется строгая типизация, разработчикам необходимо четко определить структуру и тип объекта. Кроме того, данные кодируются в двоичном формате, а не в строковом. Двоичный формат обеспечивает компактность.

Что такое JSON

JSON (JavaScript Object Notation в длинной форме) — это легкий, человекочитаемый формат обмена данными. Он широко используется для передачи данных между различными системами, особенно в веб-приложениях. Данные JSON структурированы в виде пар ключ-значение, подобно объектам в JavaScript. Это позволяет легко разбирать их и манипулировать ими с помощью языков программирования. JSON часто используется в API, для веб-сервисов и хранения данных (без SQL баз данных).

Сравнение структур

JSON против Protobuf для одного и того же объекта, я использую этот инструмент для данного примера.

Представление JSON

Представление Protobuf

Определение данных:

Фактические данные — не забывайте, что эти данные передаются в двоичном виде, поэтому их фактическая длина короче:

Чем Protobuf лучше JSON

Потребляемая память

Если коротко, то Protobuf, пожалуй, более эффективен с точки зрения использования памяти, чем JSON. Protobuf хранит данные в двоичном формате, в то время как JSON хранит все в виде строки.

Давайте рассмотрим пример с кодированием числа 12345.

При сериализации Protobuf использует схему кодирования переменной длины, называемую varint. Для небольших целых чисел, таких как 12345, varint позволяет закодировать значение в один байт.

В этом примере Protobuf, скорее всего, использует только один байт для представления целого числа 12345, в то время как JSON использует 5 байт, по одному на каждый символ, поскольку JSON кодирует все как строку, то есть в 5 раз больше! Кроме того, JSON придется добавить всю структуру (фигурные скобки, двойные кавычки, запятые…), а каждый дополнительный символ потребует еще один байт.

Protobuf также более эффективен для строк, поскольку в нем применяется тот же принцип преобразования символов в целое число и использования varint.

Процессор и обработка

Protobuf в целом обрабатывается быстрее, чем JSON. В первую очередь это связано с его более компактным двоичным форматом (меньше объем для чтения) и эффективными алгоритмами декодирования, используемыми библиотеками Protobuf. Кроме того, подход Protobuf, основанный на схемах, позволяет эффективно проводить валидацию и проверку типов, что повышает производительность.

Простота использования

JSON проще в использовании, чем Protobuf, в основном потому, что для Protobuf требуется набор инструментов, таких как компилятор. Кроме того, структура Protobuf должна быть строго определена, в то время как JSON очень гибок. JSON позволяет быстрее итерировать схему. Тем не менее, часто требуется привязать декодированный JSON к объекту, поэтому, хотя формат является гибким, его использование ненамного более гибкое, чем Protobuf.

Protobuf требует делиться pb-файлом со всеми участниками (сервером, клиентами…), поэтому протокол понятен всем сторонам.

Строгая типизация

Формат Protobuf строго типизирован. Это означает, что структура данных может быть определена с помощью примитивных типов, таких как целое число, строка… Это обеспечивает большую надежность и меньшую вероятность ошибок. С другой стороны, JSON не имеет строгого формата данных, но это часто приводит к ошибкам при разборе.

Что использовать для своего следующего приложения

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

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

Могу ли я использовать Protobuf с Retrofit или Ktor

Да, Retrofit предлагает конвертер для protobuf (как и для JSON), он работает из коробки. Вам нужно настроить Retrofit с конвертером protobuf следующим образом:

Ktor также поддерживает protobuf с помощью плагина ktor-serialization-kotlinx-protobuf.

Вам нужно инициализировать Ktor как показано ниже:

После этого вы можете использовать POJO Kotlin или Java как обычно.

Заключение

Выбор протокола взаимодействия — это большая ставка, поскольку вы можете использовать его годами. И JSON, и Protobuf могут выполнить свои задачи, но Protobuf предлагает неоспоримые преимущества перед JSON ценой немного более сложной настройки, поскольку протокол должен быть общим для разных участников.

Поскольку и Ktor, и Retrofit поддерживают Protobuf и JSON с минимальными изменениями, вы сможете перейти с одного на другой.

Если для вас важна эффективность, посоветуйтесь со своей командой и рассмотрите вариант Protobuf. Счастливого кодинга!

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: