Protocol Buffersの使い方まとめ

protocol buffersとは、Googleが自社のサービス用に開発したオブジェクトシリアライズの仕様です。
JSONに似ていますが、.protoという名前のファイルで構造を定義し、JSONのキーは数値に変換されよりデータサイズが小さい形でやりとり可能です。

開発された背景は、Googleでは社内でJavaだったりPythonだったり複数の言語が使われているので、言語ニュートラルなシリアライズデータのやりとりの仕組みが必要だったということのようです。

マニュアルには、XML-RPCよりもデータサイズが小さく解析速度は100倍早いと記述されています。
protocol buffersを使う利点としては以下のようなことが挙げられます

  • データが小さい
  • パースが速い
  • 言語に依存しない(公式のライブラリはJavaC++Pythonのみですが、Rubyのライブラリなどもあります)

現在は、パースも圧縮率も有利なMessagePackがありますが、ほぼ以下のチュートリアルのままですが、とりあえずサンプルアプリケーションを動作させるまでの手順をメモしておきます。
http://code.google.com/intl/ja/apis/protocolbuffers/docs/javatutorial.html

パースや圧縮後のデータ長については、Java版のMessagePackのライブラリを作っている方が以下のブログに掲載されています。
http://d.hatena.ne.jp/viver/20100115/p1
自分でも測ってみないとですが、非常に参考になりました。

以下、Protocol Buffers使い方メモです。

protocol buffers開発環境のダウンロード

サンプルも含むソースコードのダウンロードページは以下のURLです。
http://code.google.com/p/protobuf/downloads/list

2011年7月13日現在のバージョンは2.4.1です。
この記事は少し前に試したため、protobuf-java-2.4.0a.jarを使っています。

.protoの書き方

以下はチュートリアルのPerson.protoです。
Javaライクな記述方法でデータ構造を定義します。

package tutorial;

option java_package = "com.example.tutorial"; //この記述は無くてもJavaの場合はJavaのパッケージとして扱われる
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

message AddressBook {
  repeated Person person = 1;
}

コンパイル

コンパイラprotocのインストール

$ protoc -version
libprotoc 2.3.0

Ubuntu 10.10の場合すでにインストールされているモジュールがあるので一旦削除します。

$ sudo apt-get remove libprotobuf6

c++コンパイラが必要なのでgccとg++をインストールします。

$ sudo apt-get install gcc g++

解凍したディレクトリに移動して以下を実行

$ cd protobuf-2.4.0a
$ ./configure
$ make
$ make check
$ sudo make install

インストールの確認

$ export LD_LIBRARY_PATH=/usr/local/lib  ←Ubuntuの場合は必要だった
$ /usr/local/bin/protoc --version
libprotoc 2.4.0

あと、パスが通らなかったので./configure --prefix=/usrを指定するべきでした。

コンパイラの実行

$ cd tutorial
$ protoc -I=tutorial --java_out=tutorial tutorial/addressbook.proto

tutorialディレクトリに
com/example/tutorial/AddressBookProtos.javaが生成されました。

サンプルアプリケーション

Java用ライブラリのビルド

ビルドにはjavamavenが必要です。

$ sudo apt-get install openjdk-6-jdk
$ sudo apt-get install maven2

また、protocをコンパイル済みでアル必要があります。

$ mvn package

targetにprotobuf-java-2.4.0a.jarができます。

サンプルアプリケーションの実行
$ javac -classpath .:../java/target/protobuf-java-2.4.0a.jar AddPerson.java 
$ java -classpath .:../java/target/protobuf-java-2.4.0a.jar AddPerson addressbook_file
addressbook_file: File not found.  Creating a new file.
Enter person ID: 1
Enter name: Hiroyuki
Enter email address (blank for none): hrendoh@gmail.com
Enter a phone number (or leave blank to finish): 090xxxxxxxx
Is this a mobile, home, or work phone? mobile
Enter a phone number (or leave blank to finish):