MessagePackとProtocol Buffersを試してみた

Visual C++ 2005でMessagePackとProtocol Buffersを試してみた。

MessagePack

インストール

http://msgpack.sourceforge.jp/ から最新版(3/10の時点ではmsgpack-0.4.2.tar.gz)をダウンロードし、適当な場所に展開する。
プロジェクトファイルは付属してないので作成した。
http://github.com/firewood/test/blob/master/msgpack_vc8.sln
http://github.com/firewood/test/blob/master/msgpack_vc8.vcproj
c/msgpack/zone.hに以下の部分がある場合は削る。(msgpack/sysdep.hで吸収しているので不要)
#include
#include
プロジェクトファイルを開き、バッチビルドでDebugとRelease両方をビルドしておく。これでフォルダlib以下にmsgpack.lib(リリース版ライブラリ)とmsgpackd.lib(デバッグ版ライブラリ)ができる。

以下インストールしたフォルダをC:\msgpackとする。
VC++の開発環境の「ツール→オプション」のダイアログを開く。「プロジェクトおよびソリューション」の「VC++ディレクトリ」の「インクルードファイル」の欄に
C:\msgpack\cpp
C:\msgpack\c
C:\msgpack
を追加する。
「ライブラリファイル」の欄に
C:\msgpack\lib
を追加する。

使い方

以下のようにしてヘッダとライブラリを追加する。(msgpack.vcprojを自分のプロジェクトに追加する必要はない)
#include
#pragma comment(lib, "ws2_32.lib")
#ifdef _DEBUG
#pragma comment(lib, "msgpackd.lib")
#else
#pragma comment(lib, "msgpack.lib")
#endif

オブジェクト生成→ファイルへ保存→ファイルから読み込み→オブジェクトへ戻すというお手軽な例を書いてみた。
http://github.com/firewood/test/blob/master/MsgPackTest.cpp
http://github.com/firewood/test/blob/master/MsgPackTest.sln
http://github.com/firewood/test/blob/master/MsgPackTest.vcproj
なお公式APIドキュメントはこれ

Protocol Buffers

インストール

Google CodeのDownloadのとこから最新版(3/10の時点ではprotobuf-2.3.0.zip)をダウンロードし、適当な場所に展開する。
付属のプロジェクトファイルvsprojects/protobuf.slnにより、protoc.exeやlibprotobuf.libがビルドできる。

もしプロジェクトファイル(libprotobuf.vcproj)を自分のプロジェクトに含めないで利用する場合には、ライブラリの名前がデバッグとリリースで重複するので、プロジェクトlibprotobufのプロパティを開き、ライブラリアンの出力ファイルを$(OutDir)\$(ProjectName)d.libのように変更しておく。

以下インストールしたフォルダをC:\protobufとする。
VC++の開発環境の「ツール→オプション」のダイアログを開く。「プロジェクトおよびソリューション」の「VC++ディレクトリ」の「インクルードファイル」の欄に
C:\protobuf\src
を追加する。
「ライブラリファイル」の欄に
C:\protobuf\vsprojects\Debug
C:\protobuf\vsprojects\Release
を追加する。
「実行ファイル」の欄に
C:\protobuf\vsprojects\Release
を追加する。(protoc.exeを使用する)

Protocol Buffersでは.protoという定義ファイルをprotocという独自のコンパイラコンパイルするようになっているので、これのカスタムビルドルールを追加しておく。
カスタムビルドルールが存在しない場合、.protoファイルを追加するとダイアログで聞いてくるので、その場で作ることもできるが、参考までに以下に置いておく。
http://github.com/firewood/test/blob/master/ProtocolBuffers.rules
このファイルをVCのインストールディレクトリ(C:\Program Files\VisualStudio2005\VC\VCProjectDefaultsみたいなところ、masm.rulesとかがあるはず)に置いてから、プロジェクトを右クリックして「カスタムビルド規則」を選び、「既存ファイルの追加」で追加しておく。VCProjectDefaultsに置いておくとプロジェクト毎に指定しなくてよい。

使い方

定義ファイルHoge.protoを利用する場合、以下のような感じ。
#include "Hoge.pb.h"
#ifdef _DEBUG
#pragma comment(lib, "libprotobufd.lib")
#else
#pragma comment(lib, "libprotobuf.lib")
#endif

こちらもオブジェクト生成→ファイルへ保存→ファイルから読み込み→オブジェクトへ戻すという例。
http://github.com/firewood/test/blob/master/Hoge.proto
http://github.com/firewood/test/blob/master/ProtoBufTest.cpp
http://github.com/firewood/test/blob/master/ProtoBufTest.sln
http://github.com/firewood/test/blob/master/ProtoBufTest.vcproj
チュートリアルで十分な気はする。

感想

MessagePackは低レベル関数が最初から見えているので小回りがきくのかなと。メンバの格納順序を気にしたくない(こんな感じ http://github.com/firewood/test/blob/master/Deserial.cpp)みたいなときにカスタムデシリアライザを書くこともできる。
Protocol Buffersは、デシリアライズしたオブジェクトがそのまま使えるので便利。しかしいろんな型のものを突っ込むのはどうやったらいいのかわからない。