次世代シリアライザ Theolizer®(セオライザ) 【特許技術】
C++のプログラミングで、構造体やクラスの取り扱いに困っていませんか? 私もC++プログラムの開発で「この構造体をこのまま保存できたらいいのに」、「このクラスをこのまま送信できたら楽なのに」と思っていました。
C言語やC++では構造体やクラスを直接バイナリ形式で保存/回復でできますが余分なメンバも保存されますし、エンディアン変換ができないので異なるコンピュータ間でのデータ交換に使えません。
そこで「シリアライザ」を検討した方もいると思います。C++用のシリアライザとして有名なものは、boost::serializationとcerialがあります。これらを使えば、必要なメンバだけをxmlやJson等の形式で、コードをほとんど書かずに保存/回復できますので本当にありがたいです。
しかし、問題点が2点あります。
- 自動化可能なのに、プログラマが手で書かなくてはいけない保存/回復処理が残っています。
- バージョン変更時、回復処理の修正に非常に苦労します。(ver.4~5くらいから嫌になります。)
C#のようにリフレクションを用いてクラスのメンバ変数リストを我々のプログラムが使えるようになっていれば、その情報を使って自動的に保存/回復する処理を書けることは分かっているのですが、残念ながらC++はその情報を提供してくれません。
ですので、メンバ変数を追加/削除/変更した時、それに対応した保存/回復用のメンバ変数リストをプログラマが手でメンテナンスする必要があるのです。
例えば、メンバ変数を追加した時シリアライズ関数も修正が必要なため、余分な作業に注意力を食われて辛いです。
また、これらの内部データ構造はプログラムのバージョン・アップに伴い変わっていきます。その変更に対応できないとたいへん辛いです。例えば、ver.3のプログラムはver.1とver.2のデータも回復したいケースがほとんどと思います。すると、ver.2までに書いていた回復処理をver.3のデータを読めるように改造するだけでなくver.1, ver.2のデータを回復し、ver.3の形式へ変換できないといけません。
そして、ver.4にアップデートした場合、ver.4のデータだけでなく、ver.1, ver.2, ver.3のデータを回復してver.4の形式へ変換する処理を全て書き直すことになります。
そして、デバッグとテストのことを考えると憂鬱です。
C++でもC#のように自動的に処理される方法はないか考えました。そしてClang/LLVMのlibToolingと言う構文解析ライブラリに辿り着きました。
- ソース・コードを解析しクラスのメンバ変数リストを自動生成するTheolizerドライバ
- そのメンバ変数リストを使って、保存/回復処理を行うTheolizerライブラリ
この2つにより保存/回復処理の開発が自動化されるため、皆さんはロジック開発に集中できます。
旧来のシリアライザの場合、新たにver.4へバージョンアップした時、ver.1, ver.2, ver.3の各データをver.4データへ変換する処理を書く必要があります。
しかし、Theolizerは各バージョンの時に自動生成したメンバ変数リストを保持しますので、
ver.1→ver.2→ver.3→ver.4とカスケードにバージョンアップ処理します。
つまり、ver.4へバージョンアップした時、ver.3データをver.4データへ変換する処理を記述すれば良いのです。
[特許出願中です]
もし、この発明にご興味をお持ちの方がいらっしゃいましたらご連絡下さい。
ご相談に応じさせて頂きます。
ちょっと想像してみてください。クラスにメンバ変数を追加した時、保存/回復・通信コードを修正する必要がありません。従ってその修正に煩わされずにアプリケーション機能の開発に注力できるのです。
きっとあなたも、私のように「えっ? これで終わり?」と感じることでしょう。そして、Theolizer®を使えば、プロジェクトは余裕を持って締め切りに間に合うようになり、プログラムの開発コストを大きく削減できるようになるのです。
現在、GitHubにて公開しています。是非、Theolizer®に触れてみて下さい。
GitHubの公開リボジトリ(yossi-tahara/Theolizer)にて配布しています。
また、ドキュメントをdoc.theolizer.comにて公開しています。
マルチ・プラットフォームでC++11規格コンパイラに対応できるよう設計しています。
現時点でテストできている環境は以下の通りです。
OS | C++コンパイラ |
---|---|
Windows 10 Professional 64bit | Visual Studio C++ 2017 Community MinGW 7.1.0 32bit posix dwarf MinGW 7.1.0 64bit posix seh |
ubuntu 16.04 LTS 64bit | gcc 5.4.0(Ubuntu 5.4.0-6ubuntu1~16.04.2) |
将来的にはマッキントッシュOS Xにも対応する予定です。