Theolizer
Version.1.2.0
serializer for C++ / Do you want to update your classes easily ?
|
TheolizerはC++11で記述されたC++用のシリアライザです。
Theolizerを使うことで次のようなプログラムの開発が容易になります。
また、C++をベターCとしてお使いの方にも使って頂けるよう設計しておりますのでお気軽にお試し下さい。
マルチ・プラットフォームでC++11規格コンパイラに対応できるよう設計しています。
現時点でテストできている環境は下記の通りです。
OS | C++コンパイラ |
---|---|
Windows 10 Professional 64bit | Visual Studio C++ 2017 Community Version 15.2 MinGW 7.1.0 32bit posix dwarf(mingw-w64-install.exe) MinGW 7.1.0 64bit posix seh(mingw-w64-install.exe) |
ubuntu 16.04 LTS 64bit | gcc 5.4.0(Ubuntu 5.4.0-6ubuntu1~16.04.2) |
将来的にOS X + apple-llvmに対応する準備を進めています。
次に、ユーザ・プログラムをビルドする際に関連するツールは以下の通りです。
その他のツール | バージョン | 備考 |
---|---|---|
CMake | 3.8.0以上 | ユーザ・プログラムのビルドをアシストする際に用います Theolizerのビルドに使用しています |
boost | 1.64.0以上 | Theolizerの内部で使用しています |
CMakeは必須ではありませんが、使用することを強く推奨します。
あなたのプログラムでBoostを使っている場合、それがTheolizerで使っているものと異なるバージョンの時、注意が必要になります。「1.Theolizerライブラリの選択 」を参照下さい。
なお、CMakeはバージョンによって認識可能なBoostのバージョンが異なります。調べた範囲では以下でした。Linuxではお使いになるBoostのバージョンに合わせて選択下さい。(WindowsではCMake 3.8.0以降のVisual Studio対応機能を用いますのでCMake 3.8.0以降のみ使用可能です。)
CMakeバージョン | Boostバージョン |
---|---|
3.8.0 | 1.64.0以下 |
3.7.2 | 1.63.0以下 |
3.7.1 | 1.62.0以下 |
3.6.0 | 1.61.0以下 |
3.5.1 | 1.61.0以下 |
3.5.0 | 1.61.0以下 |
OS | C++コンパイラ |
---|---|
Windows 10 Professional 64bit | Visual Studio C++ 2015 Community update 3 MinGW 5.4.0 32bit posix dwarf MinGW 5.4.0 64bit posix seh |
ubuntu 16.04 LTS 64bit | gcc 5.4.0(Ubuntu 5.4.0-6ubuntu1~16.04.2) |
次に、ユーザ・プログラムをビルドする際に関連するツールは以下の通りです。
その他のツール | バージョン | 備考 |
---|---|---|
CMake | Visual C++は3.8.0以上 その他は3.5.0以上 | ユーザ・プログラムのビルドをアシストする際に用います Theolizerのビルドに使用しています |
boost | 1.59.0以上 | Theolizerの内部で使用しています |
C++は、クラスや構造体(以下、まとめてクラスと呼びます)に含まれるメンバのリストをプログラムがアクセスすることはできません。(メンバ1つ1つを名前を指定してアクセスすることはできますが、forループ等でメンバを次々と列挙することができないのです。) ですので、クラスをシリアライズするためにはメンバのリストを、クラス定義とは別に改めて作成する必要がありました。
TheolizerはClang/LLVMに含まれるlibToolinglibToolingの構文解析機能を用いてクラス定義を解析し、メンバのリストを自動生成します。
従って、クラス定義を変更した時もメンバ・リストへの反映漏れが無く、プログラム開発が捗ります。
1つのクラスに属するメンバ変数を保存する時、複数の異なるファイルへ保存したい時もあると思います。一部のメンバ変数は設定ファイルへ保存し、また別のメンバはデータ・ファイルへ保存したいというケースは少なくないと思います。また、一部のメンバ変数(ファイル・ハンドル等)は保存しないことも多いでしょう。
Theolizerはメンバ変数に保存先や保存の有無を指定することでクラスを分割して異なるファイルへ保存したり、一部を通信で他のプログラムへ送信したりすることができます。
一般にポインタをファイルへ保存し、プログラムを再起動した後でそのポインタを回復しても意味はありません。ポイント先のメモリ・アドレスはプログラムの再起動前後で異なることが一般的だからです。
Theolizerはポイント先のデータも一緒にファイルへ保存するのであればオブジェクト追跡によりポインタを有意味に回復することができます。もちろん通信時も同様です。
また、ポイント先がクラスの場合、その各メンバに保存先指定することができますので全てを保存する必要はありません。
これにより複雑なデータ構造を容易に保存/回復・送受信できます。
オブジェクト追跡機能はboost::serializationを参考に開発しました。
シリアライザを使って保存するということは、内部データの構造を保ったままファイルへ保存するということです。内部データ構造はプログラムの変更に伴い変更されるため、旧プログラムで保存されたファイルを回復できるようにするためには内部データ構造の変更に強い制限がかかります。
Theolizerはその制限を大幅に緩和し、古いプログラムで保存したデータを新しいプログラムで回復できます。
更に、新しいプログラムで古いプログラムが読めるデータを保存するプログラムを開発することも可能です。
クラス(class/struct)とenum型の定義を変更するに際して、2種類の変更対応方法を用意しています。
それぞれ特徴があります。
方式 | 特徴 |
---|---|
アップデート | 1.変更が容易です。 2.自動生成するソース・コードが増えないためコンパイラへの負荷が軽いです。 3.古いデータを新しいプログラムで回復できますが、逆はサポートしていません。 |
バージョン・アップ | 1.より大幅な変更に対応できます。 2.旧バージョン形式のデータを保存することができます。 3.変更作業は少し手間がかかります。 4.旧バージョンの変数リストやシンボル・リストを保持するため、 バージョン番号を上げる度に自動生成されるソース・コードが増えます。 |
可能な時はアップデートにて変更対応し、それでは不足の場合にバージョン・アップすることがお薦めです。
まとめると次のような特長があります。
Theolizerはドライバとライブラリの2つで構成されています。
項目 | 内容 |
---|---|
ドライバ | あなたのソースを解析して、シリアライズ処理に必要なコードを自動生成します。 |
ライブラリ | あなたのプログラムとリンクして、シリライズ処理を行います。 |
Theolizerドライバはあなたのビルド・プロジェクト(makeやVisual Studio)とコンパイラの間に割り込み、下記を自動的に行います。
Theolizerライブラリはあなたのプログラムとリンクして、データ構造のシリアライズとデシリアライズを行います。
ビルド・プロジェクトとコンパイラの間にTheolizerドライバを割り込む仕組みのポイントは次の3点です。
CMake 3.8.0にてVS_USER_PROPSと言うVC++のプロジェクトへインクルード指定を追加するプロパティが追加されました。
これを使ってターゲットのプロジェクト・ファイル(*.vcxproj)に<Import Project>
キーを追加し、theolizer.propsをインクルードするようにしました。
そして、theolizer.props
にて、コンパイル時に使われるPATH
を指定する<ExecutablePath>
の先頭に上記msbuild-bin
フォルダを追加しました。
以上により、Theolizerを使用するプロジェクトにおいてTheolizerドライバがコンパイラとして起動します。
対象のプロジェクトのCMAKE_CXX_COMPILERにTheolizerドライバのフルパスを設定しました。
これはmakefileのコンパイラに反映されますので、呼び出すコンパイラを変更できます。
(なお、Visual Studioはmakeではなくマイクロソフト独自のMSBuildでビルドするためこの方法が機能しません。)
CMakeでTHEOLIZER_DO_PROCESS
マクロをコンパイラ・オプションで定義するようにしまた。 このマクロがオプションで指定された時、Theolizerドライバはソース自動生成処理を行います。 そうでない時は、Theolizer関連オプションを除く全ての引数で元コンパイラを起動(パススルー)します。
CMakeは*.rspファイルに全てのオプションを記述してコンパイラへ渡します。その為、Theolizerドライバでそのオプションを削除して元コンパイラへ引き継ぐことが難しいです。しかし、削除しないとcl.exeが「知らないオプション」として警告します。 そこで、マクロ定義(/Dtheolizer_original_compiler=<元コンパイラのパス>
)で伝達することで警告表示されないようにしました。マクロ定義はリンカへ伝達する必要がないので伝わらないようです。
CMakeはgcc/mingw用にはコンパイルとリンクを分解してg++を呼び出します。 リンクの時ldを直接呼ぶわけでなく、g++にリンク指定して呼び出します。 どちらの場合もTheolizerドライバが起動されることになります。 そして、リンク動作時は-D
オプションは渡ってきません。マクロ定義はコンパイラのみ必要なオプションだからだと思います。 しかし、その結果、リンク時に起動されたTheolizerドライバが元コンパイラのパスを得ることができず、元コンパイラをパススルー起動できません。
そこで、msvc以外の時は--theolizer_original_compiler=<元コンパイラのパス>
オプションで元コンパイラのパスを伝達するようにしました。
上記はfind_packageで用いるTHEOLIZERConfig.cmake内部で対応しました。ですので、ユーザ・プログラム用のCMakeLists.txtは従来のままで使用できます。従来必要であったコンパイラのリプレース操作が不要になります。
なお、Visual Studioをお使いの場合は、CMakeを3.8.0以上へアップデートする必要があります。