Protobufの防備録
概要
仕事柄、いろんな言語で書かれたプログラムを使ったりします。
昔の会社だと.net frameworkで統一していた関係でプログラム間のやりとりは
.netのシリアライザを使用していましたが、今の会社だとネイティブアプリケーション
とかだと使えなくて(そういうわけじゃないでしょうが、面倒なので)なんかないかな
と調べたらGoogleさんが開発しているProtocol Buffers(ProtoBuf)がいい感じでしたので、これの防備録。ちょっと触った感じだと、.netのシリアライズよりをスムーズです。
使い方(!?)までやろうと思ってましたが、ことのほか色々とあったので
まずビルドまで(!?)ビルドはざっくりですが追記します。
インストール概要
Protobufはシリアライザのライブラリなので、大別して3つで構成しています。
- データをシリアライズするクラスを定義するprotoファイル
- protoファイルから各言語のクラスのコードを生成するプログラム(Protocol Compiler)
- 生成されたクラスをシリアライズ/デシリアライズするための各言語毎のライブラリ(Runtime)
なので、インストールに際してはprotocプログラムと各言語のライブラリをソースからビルドするかビルド済のバイナリをダウンロードして配置することとなります。
今回はwindows上のC++アプリと.netアプリケーションでのデータのやり取りをスムーズに行うのを目的+業務上での制約のためソースからビルドする方法で行います。
(windows visualstudioだとnugetでも可能ですが…)
ソースのダウンロード
protobufのソースはgitにあります。
ダウンロード方法はいろいろあるのでなんらかの方法(git clone などなど)でもってきてください。
まずProtoc(ProtocolCompiler)のビルドを行います。
ビルド方法の手順は上記ページのREADME.md(README.mdの「C++ Installation - Windows」の章のリンクのREADME.md)の手順どおりです。
ただgit cloneなどプログラムが使えない場合も含めて補足します。
まず、protocのビルドに関してはgmockとgtestが必要(!?)なので、これらをダウンロードします。URLは下記の通りです。
- gmock: https://github.com/google/googlemock/archive/release-1.7.0.zip
- gtest: https://github.com/google/googletest/archive/release-1.7.0.zip
ダウンロードしたら、 gtestの解凍してgmockのフォルダに置いてください。
今回は手順とは異なる点はビルド環境がVisualStudio2015の点です。
Protoc とC++のランタイムのビルド
手順ではnmakeファイルでのビルドが記載がありますが、
今回はWindows+VisualStudio上での構築のため、ソリューションファイルをcmakeで生成します。(nmakeだとC++のランタイムを使用する際に問題となったためです。)
あと現時点では、TESTのソースにエンコード上の問題!?があり、うまくビルドできず必須なものではないため、今回は生成されるプロジェクトには含まれないようにしました。
cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX=../../../../installX64 -Dprotobuf_BUILD_TESTS=OFF ../..
cmake -G "Visual Studio 14 2015" -DCMAKE_INSTALL_PREFIX=../../../../installx86 -Dprotobuf_BUILD_TESTS=OFF ../..
上記のコマンドでソリューションが生成されるため、visualstudio上かmsbuildコマンドでビルドを実行すればバイナリが生成されます。
csharp用ランタイムのビルド
今回は.net上でも使用したいため、charp用のランタイムのビルドを行います。
ダウンロードしたprotobufのソースを解凍すると「csharp」フォルダがあり、その中の「src」フォルダにソリューションファイルがあるのでvisualstudioで開いでビルドすればcsharp用(.net)のランタイムは生成されます。(シリアライズするサンプルプログラムも含まれるため、参考になります。)
使い方(ざっくり)
シリアライズしたいクラスをprotoファイルに記述してprotcで言語ごとのクラスを生成します。
protocプログラムの引数に出力したい言語ごとにoutオプションをつけるだけでクラスファイルが生成します。
- C++: --cpp_out ex. protoc.exe addressbook.proto --cpp_out=".\test"
- C#:--csharp_out ex. protoc.exe addressbook.proto --csharp_out=.\test
シリアライザを組み込みたいプログラムに生成した、コードとランタイムを用いればよいです。