Буферы протоколов
Разработчик(и) | |
---|---|
Первоначальный выпуск | Начало 2001 г. (внутреннее) [ 1 ] 7 июля 2008 г. (публично) |
Стабильная версия | 27.3 ![]() |
Репозиторий | |
Написано в | C++, C#, Java, Python, JavaScript, Ruby, Go, PHP, Dart |
Операционная система | Любой |
Платформа | Кросс-платформенный |
Тип | формат и библиотека сериализации, IDL компилятор |
Лицензия | БСД |
Веб-сайт | протобуф |
Protocol Buffers ( Protobuf ) — это формат данных с открытым исходным кодом, бесплатный кроссплатформенный используемый для сериализации структурированных данных. Это полезно при разработке программ, которые взаимодействуют друг с другом по сети или для хранения данных. Этот метод включает в себя язык описания интерфейса , который описывает структуру некоторых данных, и программу, которая генерирует исходный код на основе этого описания для создания или анализа потока байтов, представляющего структурированные данные.
Обзор
[ редактировать ]Google разработала протокольные буферы для внутреннего использования и предоставила генератор кода для нескольких языков по лицензии с открытым исходным кодом .
Цели разработки протокольных буферов подчеркивали простоту и производительность. В частности, он был спроектирован так, чтобы быть меньше и быстрее, чем XML . [ 3 ]
Протокол Buffers широко используется в Google для хранения и обмена всеми видами структурированной информации. Этот метод служит основой для специальной системы удаленного вызова процедур (RPC), которая используется практически для всех межмашинных коммуникаций в Google. [ 4 ]
Протокол Buffers аналогичен протоколам Apache Thrift , Ion и Microsoft Bond, предлагая конкретный стек протоколов RPC для использования для определенных служб, называемых gRPC . [ 5 ]
Схемы структур данных (называемые сообщениями ) и службы описаны в файле определения прототипа ( .proto
) и скомпилирован с помощью protoc
. Эта компиляция генерирует код, который может быть вызван отправителем или получателем этих структур данных. Например, example.pb.cc
и example.pb.h
генерируются из example.proto
. Они определяют классы C++ для каждого сообщения и службы в example.proto
.
Канонически сообщения сериализуются в двоичный . формат, который компактен, совместим с прямыми и обратными версиями , но не имеет самоописания (то есть невозможно указать имена, значения или полные типы данных полей без внешней спецификации) ). Не существует определенного способа включения или ссылки на такую внешнюю спецификацию ( схему ) в файле буферов протокола. Официально поддерживаемая реализация включает формат сериализации ASCII. [ 6 ] но этот формат, хотя и самоописывающийся, теряет свойства прямой и обратной совместимости и, таким образом, не является хорошим выбором для других приложений, кроме редактирования и отладки человеком. [ 7 ]
Хотя основной целью протокольных буферов является облегчение сетевого взаимодействия, их простота и скорость делают протокольные буферы альтернативой ориентированным на данные классам и структурам C++, особенно там, где в будущем может потребоваться взаимодействие с другими языками или системами.
Ограничения
[ редактировать ]У Protobufs нет единой спецификации. [ 8 ] Этот формат лучше всего подходит для небольших фрагментов данных, размер которых не превышает нескольких мегабайт и которые можно сразу загрузить/отправить в память, и поэтому он не является потоковым форматом. [ 9 ] Библиотека не обеспечивает сжатие «из коробки». Этот формат также плохо поддерживается в необъектно-ориентированных языках (например, Фортране ). [ 10 ]
Пример
[ редактировать ]Схема для конкретного использования буферов протокола связывает типы данных с именами полей, используя целые числа для идентификации каждого поля. (Данные протокольного буфера содержат только числа, а не имена полей, что обеспечивает некоторую экономию пропускной способности и объема памяти по сравнению с системами, которые включают в данные имена полей.)
// 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;
}
Сообщение «Точка» определяет два обязательных элемента данных: x и y . элемента данных Метка не является обязательной. Каждый элемент данных имеет тег. Тег определяется после знака равенства. Например, x имеет тег 1.
Сообщения «Линия» и «Полилиния», оба из которых используют точку, демонстрируют, как работает композиция в буферах протокола. Полилиния имеет повторяющееся поле, поэтому полилиния ведет себя как набор точек (неопределенного количества).
Эту схему впоследствии можно скомпилировать для использования одним или несколькими языками программирования. Google предоставляет компилятор под названием protoc
который может создавать выходные данные для C++, Java или Python. Другие компиляторы схем доступны из других источников и позволяют создавать зависящие от языка выходные данные для более чем 20 других языков. [ 11 ]
Например, после создания версии 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# , [ 12 ] и Питон . [ 13 ]
Protobuf 3.0 предоставляет генератор кода для C++ , Java (включая JavaNano, диалект, предназначенный для малоресурсных сред ), Python , Go , Ruby , Objective-C , C# . [ 14 ] Он также поддерживает JavaScript, начиная с версии 3.0.0-beta-2. [ 15 ]
также доступны сторонние реализации Для Ballerina , [ 16 ] С , [ 17 ] [ 18 ] С++ , [ 19 ] Дротик , Эликсир , [ 20 ] [ 21 ] Эрланг , [ 22 ] Хаскелл , [ 23 ] JavaScript , [ 24 ] Юля , [ 25 ] Nim , [ 26 ] Перл , PHP , Пролог , [ 27 ] [ 28 ] Р , [ 29 ] Ржавчина , [ 30 ] [ 31 ] [ 32 ] Скала , [ 33 ] и Свифт . [ 34 ]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Часто задаваемые вопросы | Буферы протокола» . Разработчики Google . Проверено 2 октября 2016 г.
- ^ «Релизы — google/protobuf» — через GitHub .
- ^ Эйшай Смит. «Бенчмарки jvm-сериализаторов» . Гитхаб . Проверено 12 июля 2010 г.
- ^ Кентон Варда. «Ответ Стиву Виноски» . Проверено 14 июля 2008 г.
- ^ "грпк" . grpc.io. Проверено 2 октября 2016 г.
- ^ «text_format.h — Буферы протокола — Код Google» . Проверено 2 марта 2012 г.
- ^ «Лучшие практики Proto | Документация по буферам протоколов» . Проверено 26 мая 2023 г.
- ^ «Обзор» . protobuf.dev . Проверено 28 мая 2023 г.
- ^ «Обзор» . protobuf.dev . Проверено 28 мая 2023 г.
- ^ «Обзор» . protobuf.dev . Проверено 28 мая 2023 г.
- ^ ThirdPartyAddOns — protobuf — Ссылки на сторонние дополнения. - Буферы протоколов - Формат обмена данными Google - Хостинг проектов Google . Код.google.com. Проверено 18 сентября 2013 г.
- ^ «Буферы протоколов в C#» . Блокировка кода . Проверено 12 мая 2017 г.
- ^ «Руководство по языку протокольных буферов» . Разработчики Google . Проверено 21 апреля 2016 г.
- ^ «Языковое руководство (proto3) | Буферы протоколов» . Разработчики Google . Проверено 9 августа 2020 г.
- ^ «Выпуск буферов протокола v3.0.0-beta-2 · протоколбуферы/protobuf» . Гитхаб . Проверено 9 августа 2020 г.
- ^ «Балерина – ГРПК» . Архивировано из оригинала 15 ноября 2021 г. Проверено 24 марта 2021 г.
- ^ «Nanopb — буферы протокола с малым размером кода» . Проверено 12 декабря 2017 г.
- ^ «Реализация протокольных буферов на C» . Гитхаб . Проверено 12 декабря 2017 г.
- ^ «Встроенный Proto-Protobuf для микроконтроллеров» . Проверено 15 августа 2021 г.
- ^ «Протокс» . Гитхаб . 25 октября 2021 г.
- ^ «Протобуф-эликсир» . Гитхаб . 26 октября 2021 г.
- ^ «Томас-Абрахамссон/GPB» . Гитхаб . 19 октября 2021 г.
- ^ «Протолинза» . Гитхаб . 16 октября 2021 г.
- ^ «Буферы протокола для JavaScript» . github.com . Проверено 14 мая 2016 г.
- ^ «ThirdPartyAddOns — protobuf — Ссылки на сторонние дополнения. — Буферы протоколов — Формат обмена данными Google — Хостинг проектов Google» . Проверено 7 ноября 2012 г.
- ^ «Реализация Protobuf в чистом Nim, которая использует возможности макросистемы, чтобы не зависеть от каких-либо внешних инструментов» . Гитхаб . 21 октября 2021 г.
- ^ «SWI-Prolog: библиотека буферов протоколов Google» .
- ^ «SWI-Prolog/contrib-protobufs» . Гитхаб . Проверено 21 апреля 2022 г.
- ^ «РПротоБуф» . Гитхаб .
- ^ «Ржавчина-протобуф» . Гитхаб . 26 октября 2021 г.
- ^ «ПРОСТ!» . Гитхаб . 21 августа 2021 г.
- ^ «Быстрый-протобуф» . Гитхаб . 12 октября 2021 г.
- ^ «СкалаПБ» . Гитхаб . Проверено 27 сентября 2022 г.
- ^ «Свифт Протобуф» . Гитхаб . 26 октября 2021 г.
Внешние ссылки
[ редактировать ]- Официальная документация на сайте Developers.google.com.
- протобуф на GitHub
- Mouse Melon — графический интерфейс для редактирования данных протокольных буферов.