C++でGoogle Protocol Buffersを使う方法
提供: C++入門
スポンサーリンク
Googleが開発したProtocol Buffers(protobuf)とは、構造化データのシリアライズを実現するライブラリです。
読み方
- Protocol Buffers
- ぷろとこる ばっふぁーず
- protobuf
- ぷろと ばふ
目次
概要
Protocol Buffers は、 C++ や Java などいろいろな言語で利用できます。
XMLやJSONなどの問題点
プログラムがデータを扱うときに、XMLやJSONなどが使われています。XMLなどの構造は、人間が目で確認ができるメリットもあります(目で見たいものでもないですし、データによっては人が見るには向いてないと判断されるケースもあります)。
XMLやJSONなどが簡単で、柔軟に使える一方で、以下のデメリットがあります。
- データサイズが大きくなる
- データの解析が遅い
XML は、データが大きくなりがちですよね。 JSON は、データサイズの情報などを持たないため、データの量が多くなるとパースする処理が遅くなってしまいます。JSONの欠点を補うBSONもありますが。
Protocol Buffers とは
Protocol Buffers は、XMLやJSONとは違い、プログラミングする前に、データ構造(IDL)を決めます。Protocol Buffers で扱われるデータは、バイナリベースのエンコード形式になります。IDLから各言語用のシリアライザ・デシリアライザを生成します。
Protocol Buffers の使い方
- データ構造の定義 IDL を作る(proto ファイル)
- IDL (protoファイル)から言語用のヘッダ、ソースを作成する(protocコマンドで自動生成)
- C++言語のプログラムを作成する
- コンパイルする
インストール
FreeBSDの場合
sudo pkg install protobuf
IDL user.proto
package userdb; message User { required string id = 1; required string pw = 2; optional int32 age = 3; }
ソースコード シリアライズの例
/* * main.cc * Copyright (C) 2016 kaoru <kaoru@localhost> * * Distributed under terms of the MIT license. */ #include <iostream> #include "user.pb.h" using namespace std; int main(int argc, char const* argv[]) { userdb::User u1; u1.set_id("abc"); u1.set_pw("pass1"); string serialized_str; u1.SerializeToString(&serialized_str); cout << serialized_str<< endl; return 0; }
コンパイル
protoc -I=. --cpp_out=. user.proto c++ -O2 -pipe -g -Wall -I/usr/local/include -L/usr/local/lib -lprotobuf main.cc user.pb.cc
実行例
$ ./a.out |hexdump -C 00000000 0a 03 61 62 63 12 05 70 61 73 73 31 0a |..abc..pass1.| 0000000d
関連項目
ツイート
スポンサーリンク