Протокол Protobuf

Материал из BrSTU Robotics Wiki
Перейти к: навигация, поиск

Что такое Protocol Buffers?

Protocol buffers - это языко- и платформонезависимый, расширяемый механизм для сериализации/десериализации структурированных данных, разработанный в Google. Сначала Вы определяете как будут структурированы ваши данные, а затем на основе описания этих данных генерируется исходный код, который позволяет легко работать с различными потоками данных на разных языках – Java, C++, или Python. Добровольцами созданы реализации компилятора и для других языков, официально не поддерживаемых.

Особенности

  • Формат протокола описывается на специальном языке proto в виде структурированных сообщений (message).
  • Каждое сообщение - это совокупность пар ключ-значение, передаваемых в одном сообщении протокола.
  • Каждая пара ключ значение может быть требуемой (requied), опциональной (optional) или повторяемой (repeatable).
  • В языке поддерживаются различные типы примитивов - singned/unsigned fixed/varlen int32 или int64, float, bool, string (UTF-8), bytes (массив байт). Некоторые типы данных являются взаимозаменяемыми. Можно описывать перечисления (enum), а так же ссылаться на уже ранее описанные сообщения (композиция).
  • Опциональным допускается иметь значения по умолчанию. Значения по умолчанию не сереализуются при передаче, а просто подставляются, если значение не было задано.
  • После компиляции .proto файла генерируется код на C++/Java/Python отражающий протокол на данном языке + вся инфраструктура для передачи данных. Значения пар ключ-значения сообщения протокола записываются уже в реализации конкретного языка.
  • Кодировать и декодировать сообщение можно разными языками.
  • Формат передачи сообщений protobuf - бинарный (кодирование).
  • Меньше по размерам, быстрее в передаче, легче в чтении чем XML.
  • Поддерживается расширение уже существующих протоколов - примерный аналог наследования.
  • Сделано все, что бы поддерживать обратную совместимость со старыми версиями, а расширение протокола было безболезненным. Поддерживает безболезненное расширение протокола (старый код не будет сломан) если старый протокол будет подмножеством нового протокола. В таком случае, старый код просто проигнорирует новые поля, добавленные в новой версии протокола. Есть best-practices по написанию устойчивых к изменениям протоколов.
  • Позволяет описывать сервисы (ключевое слово service) в стиле RPC, для которых компилятор protoс сгенерирует все заглушки на требуемом языке. Реализацию удаленной процедуры программист обязан реализовать сам (в Java это делается реализацией специально сгенерированного интерфейса).
  • Есть параметры оптимизации, а так же всякие дополнительные настройки.
  • Protobuf не рассчитан на большие массивы передаваемых данных, а на множество мелких сообщений.

Установка

  • Собрать или скачать компилятор.
  • Не забыть скомпилить descriptor.proto в src/google/protobuf
  • Java сборка через maven может выполняться только после ручной сборки компилятора protoc из исходников.

Ссылки