Разработка
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
{
"firstname": "John",
"lastname": "Doe",
"dateOfBirth": "1990–01–01",
"city": "New York"
}
Представление Protobuf
Определение данных:
xxxxxxxxxx
message Person {
string firstname = 1;
string lastname = 2;
string dateOfBirth = 3;
string city = 4;
}
Фактические данные — не забывайте, что эти данные передаются в двоичном виде, поэтому их фактическая длина короче:
xxxxxxxxxx
Base64: CgRKb2huEgNEb2UaDjE5OTDigJMwMeKAkzAxIghOZXcgWW9yaw==
Hex: 0a044a6f686e1203446f651a0e31393930e280933031e28093303122084e657720596f726b
Чем 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 следующим образом:
xxxxxxxxxx
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL_STRING)
.addConverterFactory(ProtoConverterFactory.create())
.build();
Ktor также поддерживает protobuf с помощью плагина ktor-serialization-kotlinx-protobuf.
Вам нужно инициализировать Ktor как показано ниже:
xxxxxxxxxx
install(ContentNegotiation) {
protobuf()
}
После этого вы можете использовать POJO Kotlin или Java как обычно.
Заключение
Выбор протокола взаимодействия — это большая ставка, поскольку вы можете использовать его годами. И JSON, и Protobuf могут выполнить свои задачи, но Protobuf предлагает неоспоримые преимущества перед JSON ценой немного более сложной настройки, поскольку протокол должен быть общим для разных участников.
Поскольку и Ktor, и Retrofit поддерживают Protobuf и JSON с минимальными изменениями, вы сможете перейти с одного на другой.
Если для вас важна эффективность, посоветуйтесь со своей командой и рассмотрите вариант Protobuf. Счастливого кодинга!
-
Программирование4 недели назад
Конец программирования в том виде, в котором мы его знаем
-
Видео и подкасты для разработчиков2 недели назад
Как устроена мобильная архитектура. Интервью с тех. лидером юнита «Mobile Architecture» из AvitoTech
-
Магазины приложений4 недели назад
Магазин игр Aptoide запустился на iOS в Европе
-
Новости4 недели назад
Видео и подкасты о мобильной разработке 2025.8