Site icon AppTractor

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

Введение

Как 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

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

message Person {
 string firstname = 1;
 string lastname = 2;
 string dateOfBirth = 3;
 string city = 4;
}

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

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 следующим образом:

Retrofit retrofit = new Retrofit.Builder()
 .baseUrl(API_URL_STRING)
 .addConverterFactory(ProtoConverterFactory.create())
 .build();

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

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

install(ContentNegotiation) {
 protobuf()
}

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

Заключение

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

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

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

Источник

Exit mobile version