Protocol Buffersの使い方まとめ
protocol buffersとは、Googleが自社のサービス用に開発したオブジェクトシリアライズの仕様です。
JSONに似ていますが、.protoという名前のファイルで構造を定義し、JSONのキーは数値に変換されよりデータサイズが小さい形でやりとり可能です。
開発された背景は、Googleでは社内でJavaだったりPythonだったり複数の言語が使われているので、言語ニュートラルなシリアライズデータのやりとりの仕組みが必要だったということのようです。
マニュアルには、XML-RPCよりもデータサイズが小さく解析速度は100倍早いと記述されています。
protocol buffersを使う利点としては以下のようなことが挙げられます
現在は、パースも圧縮率も有利な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用ライブラリのビルド
$ 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):