Carpe Diem

備忘録。https://github.com/jun06t

Protocol Buffersを使ってみる

Google Protocol Buffersを使ってみます。 これはJSONXMLなどの冗長なファイルをシリアライズ(バイナリ化)することでデータの転送を速くするためのものです。 ・プログラミング言語に依存しない ・コンパクトなバイナリ形式を採用 ・データアクセスコードを自動生成 などのメリットがあります。 ==== 使い方の流れとしては ◆前準備 ①.protoファイルを作成(定義ファイル) ②protocコマンドでスキーマファイルの作成 ◆プログラム内 ③スキーマファイルからスキーマオブジェクト(schemaObj)を生成 ④schemaObj.serialize(obj)でバイナリ化、schemaObj.parse(binary)でもとに戻す です。 ではまずソースからインストールしてみます。 ◆インストール https://code.google.com/p/protobuf/downloads/list ダウンロードして展開します。 $ tar xvzf protobuf-2.5.0.tar.gz $ cd protobuf-2.5.0 $ ./configure $ make $ make check $ sudo make install でインストール完了です。 ◆.protoファイルの作成 今回はNodeでやってみます。 var hoge = {x:1, y:"fuga", z:true}; というオブジェクトをシリアライズ、デコードしてみます。 ./protos/test.proto

package Test;
message TestData {
    optional int32 x = 1;
    optional string y = 2;
    optional bool z = 3;
}

ファイルの型はprotoファイルの記述を参考にしてください。 ◆protocコマンドでスキーマ作成 $ protoc -o protos/test.desc protos/test.proto これで前準備は完了です。 ◆Nodeにnode-protobufのインストール パッケージをインストールします。 package.jsonのdependenciesに

"dependencies": {
  "protobuf": "git://github.com/chrisdew/protobuf.git"
}

を付け足して $ npm install シリアライズ、デコードをする プログラムtest.jsを作ります。

var fs = require('fs');
var path = require('path');
var Schema = require('protobuf').Schema;

var readFileSyncRelative = function(file) {
  return fs.readFileSync(path.resolve(__dirname, file));
};

var schema = new Schema(readFileSyncRelative('protos/test.desc'));
var Test = schema['Test.TestData'];

var fuga = {x:1, y:"fuga", z:true};

var testEncode = Test.serialize(fuga);
var testDecode = Test.parse(testEncode);
console.log(testDecode);

実行します。 $ node test.js 結果: { x: 1, y: 'fuga', z: true } 確認できました。 ソース: Protocol Buffersを使う protoファイルの記述 protobuf-for-node