趣味の開発日記

開発のメモです。

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にあります。

github.com

ダウンロード方法はいろいろあるのでなんらかの方法(git clone などなど)でもってきてください。

 

まずProtoc(ProtocolCompiler)のビルドを行います。

 

ビルド方法の手順は上記ページのREADME.md(README.mdの「C++ Installation - Windows」の章のリンクのREADME.md)の手順どおりです。

ただgit cloneなどプログラムが使えない場合も含めて補足します。

まず、protocのビルドに関してはgmockとgtestが必要(!?)なので、これらをダウンロードします。URLは下記の通りです。

 

ダウンロードしたら、 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

リアライザを組み込みたいプログラムに生成した、コードとランタイムを用いればよいです。

 

開発の効率化⁉︎

昔はWindowsアプリケーションばかりを開発してたので、ついついちゃんと作るイコールGUIと延髄反射してたが、マウス操作だと肩は疲れるし、作るの大変だし、ソフト上でしてた操作を記録するのも大変だしって事でCUIでも活用しようと考えてます。

それで、まずソースのビルドまわり(visualstudioとcmake)のコマンドまとめです。

visualstudio

ビルド

msbuild ソリューションファイル or プロジェクトファイル