Буферы протокола - Protocol Buffers

Буферы протокола
Разработчики) Google
Первый выпуск Начало 2001 г. (внутреннее)
7 июля 2008 г. (общедоступное) ( 2007-07-07 )
Стабильный выпуск
3.17.3  Отредактируйте это в Викиданных / 8 июня 2021 г . ; 3 месяца назад ( 8 июня 2021 г. )
Репозиторий
Написано в C ++, C #, Java, Python, JavaScript, Ruby, Go, PHP, Dart
Операционная система Любой
Платформа Кроссплатформенность
Тип формат и библиотека сериализации, компилятор IDL
Лицензия BSD
Веб-сайт разработчики .google .com / протокол-буферы / Отредактируйте это в Викиданных

Protocol Buffers ( Protobuf ) - это бесплатная кросс-платформенная библиотека с открытым исходным кодом, используемая для сериализации структурированных данных. Это полезно при разработке программ для связи друг с другом по сети или для хранения данных. Метод включает язык описания интерфейса, который описывает структуру некоторых данных, и программу, которая генерирует исходный код из этого описания для генерации или анализа потока байтов, представляющего структурированные данные.

Обзор

Компания Google разработала Protocol Buffers для внутреннего использования и предоставила генератор кода для нескольких языков по лицензии с открытым исходным кодом (см. Ниже ).

Цели разработки протокольных буферов подчеркивали простоту и производительность. В частности, он был меньше и быстрее XML .

Буферы протокола широко используются в Google для хранения и обмена всех видов структурированной информации. Этот метод служит основой для системы пользовательского удаленного вызова процедур (RPC), которая используется почти для всех межмашинных коммуникаций в Google.

Буферы протоколов аналогичны протоколам Apache Thrift (используется Facebook, Evernote ), Ion (создан Amazon) или Microsoft Bond, предлагая также конкретный стек протоколов RPC для использования для определенных служб, называемых gRPC .

Структуры данных (называемые сообщениями ) и службы описаны в файле определения прототипа ( .proto) и скомпилированы с помощью protoc. Эта компиляция генерирует код, который может быть вызван отправителем или получателем этих структур данных. Например, example.pb.ccи example.pb.hгенерируются из example.proto. Они определяют классы C ++ для каждого сообщения и службы в example.proto.

Канонически сообщения сериализуются в двоичный проводной формат, который является компактным, совместимым с прямой и обратной связью, но не самоописывается (то есть невозможно указать имена, значение или полные типы данных полей без внешней спецификации ). Не существует определенного способа включения или ссылки на такую ​​внешнюю спецификацию ( схему ) в файле протокольных буферов. Официально поддерживаемая реализация включает в себя формат сериализации ASCII, но этот формат, хотя и самоописывающий, теряет поведение прямой и обратной совместимости и, таким образом, не является хорошим выбором для приложений, кроме отладки.

Хотя основная цель протокольных буферов - облегчить сетевое взаимодействие, их простота и скорость делают протокольные буферы альтернативой ориентированным на данные классам и структурам C ++, особенно там, где в будущем может потребоваться взаимодействие с другими языками или системами.

Пример

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

//polyline.proto
syntax = "proto2";

message Point {
  required int32 x = 1;
  required int32 y = 2;
  optional string label = 3;
}

message Line {
  required Point start = 1;
  required Point end = 2;
  optional string label = 3;
}

message Polyline {
  repeated Point point = 1;
  optional string label = 2;
}

Сообщение «Point» определяет два обязательных элемента данных, x и y . Метка элемента данных не является обязательной. У каждого элемента данных есть тег. Тег определяется после знака равенства. Например, x имеет тег 1.

Сообщения «Линия» и «Ломаная линия», в которых используется точка, демонстрируют, как композиция работает в буферах протокола. Ломаная линия имеет повторяющееся поле, которое ведет себя как вектор.

Эта схема впоследствии может быть скомпилирована для использования одним или несколькими языками программирования. Google предоставляет компилятор, protocкоторый может производить вывод для C ++, Java или Python. Другие компиляторы схемы доступны из других источников для создания зависимого от языка вывода для более чем 20 других языков.

Например, после создания C ++ версии схемы буфера протокола выше, файл исходного кода C ++ polyline.cpp может использовать объекты сообщения следующим образом:

// polyline.cpp
#include "polyline.pb.h"  // generated by calling "protoc polyline.proto"

Line* createNewLine(const std::string& name) {
  // create a line from (10, 20) to (30, 40)
  Line* line = new Line;
  line->mutable_start()->set_x(10);
  line->mutable_start()->set_y(20);
  line->mutable_end()->set_x(30);
  line->mutable_end()->set_y(40);
  line->set_label(name);
  return line;
}

Polyline* createNewPolyline() {
  // create a polyline with points at (10,10) and (20,20)
  Polyline* polyline = new Polyline;
  Point* point1 = polyline->add_point();
  point1->set_x(10);
  point1->set_y(10);
  Point* point2 = polyline->add_point();
  point2->set_x(20);
  point2->set_y(20);
  return polyline;
}

Языковая поддержка

Protobuf 2.0 предоставляет генератор кода для C ++ , Java , C # и Python .

Protobuf 3.0 предоставляет генератор кода для C ++ , Java (включая JavaNano, диалект, предназначенный для сред с низким уровнем ресурсов ), Python , Go , Ruby , Objective-C , C # . Он также поддерживает JavaScript, начиная с версии 3.0.0-beta-2.

Сторонние реализации также доступны для Ballerina , C , C ++ , Dart , Elixir , Erlang , Haskell , JavaScript , Perl , PHP , R , Rust , Scala , Swift , Julia и Nim .


Смотрите также

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

внешние ссылки