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

関連項目




スポンサーリンク