Protocol Buffers, как его использовать
Как альтернатива XML и базам данных, формат Protocol Buffers был создан Google для резервного копирования структурированных данных в двойном виде, удобном для чтения и бинарном, компактном и простом в обработке для программ.
Формат расширяется.
Почему «Протокольные буферы»?
Этот формат был определен Google как альтернатива XML для более быстрой обработки файлов, особенно для своих собственных нужд, поскольку миллионы серверов используют объемы данных.
Самый простой способ обработки данных заключается в том, что он находится в виде объекта в памяти и остается постоянным в файле, поэтому существует принцип сериализации, который заключается в сохранении всего объекта в файле.
Это можно сделать в XML, но так же, как JSON предоставляет более прямой способ сделать это в JavaScript, PB предоставляет прямой способ сделать это для других языков программирования, таких как C++ и Java. JSON основывается на динамических переменных JavaScript, в то время как PB определяет тип данных.
JSON подходит лучше XML для JavaScript, PB подходит лучше XML для других языков, потому что у него нет недостатков XML, большого потребления пространства и достаточно тяжелой обработки для преобразования данных. Однако он сохраняет свои преимущества - гибкость и легкое чтение.
Хотя PB на данный момент работает только с C++ и Java, авторы работают над его переносом на другие языки, в частности PHP и Silverlight, поэтому в ближайшее время он должен принадлежать к веб-ландшафту.
Как работает PB
?Компилятор, предоставленный Google, позволяет из описания прото-документа генерировать класс для программного обеспечения. Этот класс содержит методы, которые автоматически кодируют данные в бинарном файле или загружают бинарный файл и расшифровывают его.
В дальнейшем можно будет расширить определение и продолжить чтение уже созданных файлов.
Таким образом, мы делаем следующие шаги:
- Вы определяете структуру протокола.
- Компилятор создает класс, который является подклассом класса Message.
- Вы пишете программу, используя этот класс.
- Вы компилируете его, включив созданный класс и книжный магазин protobuf.
- Данные можно сохранить в файл proto с помощью функции сериализации, унаследованной от класса Message.
- Вы также можете создать веб-службу и установить канал обмена с клиентом.
- Данные вашей программы обмениваются между клиентом и сервером по вашему протоколу.
Как использовать Protocol Buffers
Использовать прото очень просто. Вот шаги по созданию первой программы с помощью Protocol Buffers.
1) Загрузить архив
Вам понадобится два архива для компилятора и библиотеки для включения.
На сайте Google Protocol buffer выберите архив, соответствующий вашей системе.
Извлечь содержимое, в результате чего создается каталог Protobuf и появляется компилятор protoc.
2) Компиляция книжного магазина protobuf
Процедура зависит от языка, компилятора и системы, и это объясняется в файле README.txt в корне каталога Protobuf, извлеченном из архива.
Чтобы проиллюстрировать наш пример, мы будем использовать Visual Studio Express под Windows.
Запустить VSE и загрузить файл проекта, расположенный в каталоге vsprojects.
Запуск компиляции, вероятно, будет предшествовать преобразованию, поскольку файл проекта должен быть совместим со старыми версиями VSE.
Макфайл воссоздаст количество файлов, но все, что нас интересует - это:
protobuf.lib protobuf.dll
Как и файлы, сопровождающие protobuf.dll, с добавленным расширением.
3) Создание среды развития
По практическим причинам для нашего проекта стоит создать новый репертуар. Его можно назвать «прото», например.
В этой директории записываются:
protoc.exe
protobuf.lib protobuf.dll et les fichiers d'accompagnement. google --- le sous-répertoire de Protobuf
Это proto-компилятор (protoco.exe под Windows), библиотеки и каталог файлов заголовков, которые нужно включить.
4) Определить файл proto
В этот минималистский файл мы добавляем одно инициализированное поле данных с текстом «Hello World!».
Определяем текстовое поле, которое называем «data»:
message hello
{
required string data;
}
Добавляем порядковый номер :
message hello
{
required string data = 1;
}
Добавляем значение по умолчанию, которое инициализирует поле и заключено в скобки :
[default="Hello World!"]
Это дает следующее полное определение :
message hello
{
required string data = 1 [default="Hello World!"];
}
Файл сохраняется под именем hello.proto в нашем рабочем каталоге.
5) Скомпилировать файл proto
Создан пакетный файл с именем makehello.bat, содержащий следующую команду:
protoc --cpp_out=. hello.proto
параметр --cpp_out обслуживает каталог назначения, точка указывает текущий каталог.
hello.proto - это созданный ранее файл определений.
Компиляция создаст следующие файлы:
hello.pb.cc hello.pb.h
Компилятор protoc генерировал класс C++, соответствующий нашему определению, и соответствующий заголовочный файл.
Нам осталось создать программу на языке C++ для использования этого класса.
6) Написать программу hello
Примером использования класса будет просто отображение сообщения, содержащегося в файле. Затем мы изменим содержание поля, присвоив ему другую строку.
int main()
{
hello demo; // instance "demo" of the "hello" class defined in proto
const std::string& test = demo.data(); // data is the field where the text was stored
cout << test << "\n";
demo.set_data("How do you do?"); // changing the data
cout << demo.data() << "\n";
return 0;
}
Параметр demo.data () позволяет получить доступ к содержимому поля данных нашего определения proto. Этот интерфейс генерируется компилятором protoc.
Также создается инструкция demo.set_data (), позволяющая изменять содержимое поля .
Полный исходный код находится в архиве.
7) Компилировать программу hello
Пакетный файл будет дополнен двумя строками. Первый скомпилирует файл, созданный протоком, что производит hello.pb.obj, второй - компилирует наш собственный скрипт:
protoc --cpp_out=. hello.proto cl hello.pb.cc /EHsc -I. -c cl hello.cpp /EHsc -I. hello.pb.obj libprotobuf.lib
Во вторую команду компиляции был включен файл hello.pb.obj и интерфейс runtime protobuf.lib (который позволяет получить доступ к содержимому protobuf.dll).
Запустить makedemo.bat, создается программа hello.exe. Он должен показывать:
Hello World! How do you do?
8) Резервное копирование данных класса
С помощью методов, унаследованных от суперкласса Message, содержимое, измененное в нашем классе, может быть постоянно сохранено и найдено при дальнейшем использовании файла proto или той же или другой программой.
Для этого можно использовать функцию C++ fstream в сочетании с унаследованным методом SerializeToOstream.
Определяем новый файл прото-упрощений:
message hello { required int32 data = 1 [default=10]; }
Тело функции затем становится:
fstream input("hellowrite.proto", ios::in | ios::binary); cout << demo.data() << "\n"; demo.set_data(demo.data() + 10); // adding a value fstream output("hellowrite.proto", ios::out | ios::trunc | ios::binary); demo.SerializeToOstream(&output);
A chaque fois que nous lançons le programme, le nombre affiché est augmenté de 10 ce qui nous prouve que le contenu de data est bien sauvegardé sur disque. En fait un nouveau fichier proto binaire est créé avec la nouvelle valeur stockée.
Le code source complet est dans l'archive.
9) Utilisation sur un serveur
Le compilateur crée aussi des interfaces entre le serveur et les clients, pour cela il faut définir un service:
service hello { rpc data(HelloRequest) returns(HelloResponse); }
Le processus de la création d'un service est décrit dans l'API Protocol Buffers.
data_Stub(RpcChannel* channel)
L'instruction crée un accès au channel auquel on peut envoyer un message.
Ceci est détaillé dans le tutoriel de Google.
Aller plus loin
Ceci n'est qu'une introduction à l'utilisation du langage Protocol Buffer. Pour une explication détaillée du format, allez sur le site de Google:
Consulter également le fichier d'en-tête généré par protoc, il fournit la liste des méthodes disponibles.
Les exemples de ce tutoriel sont réduits au minimum utile à la compréhension, ils ne sont pas utilisables tels quels en production. Dans vos applications de nombreux contrôles devront être ajoutés.
Download les examples
- L'archive hello.zip contient tous les fichiers mentionnés dans ce tutoriel ajoutés à l'environnement standard.