2011-01-11 7 views
0

私はC++でたくさんの構造体を持っています。私はそれをファイルに保存して再度ロードしたいと思います。問題は、私の構造体のいくつかは、基本クラス(/構造体)へのポインタです。だからタイプを見つけてそれを作成する方法が必要です。彼らは本当にちょうどPODです、彼らはすべてパブリックメンバーを持ち、コンストラクタはありません。C++(semi)ファイルセーブ/ロードのリフレクション? (ハック?)

ファイルからファイルを保存してロードする最も簡単な方法は何ですか?私はたくさんの構造体を持っていますが、私が使用する唯一の型はint、ポインタまたはcの文字列です。私はいくつかのマクロのハックをすることができると思っています。しかし、実際に私は何をすべきか分かりません。

答えて

2

ここであなた自身をロールしないでください - よく開発されテストされたものを使用してください。最初の...私は、複数の構造体が実際に同じポインタを参照し、デシリアライズ時に再作成される単一のポインタを希望することを可能と仮定

:ひとつのアイデアは、Protocol Buffers

+0

それは私が書いたコードの小さな行から多くの生成コードです。 –

+1

@ acidzombie24:それは全体のアイデアです:-)誰かがあなたのために仕事をしてくれました –

0

ポインタが特定の問題を提起しています

:アイデア、ボイラープレートコードを避けるために、コンパイル時の反射ツールを作成することです

これらの2つのマクロは、コンパイル時と実行時のギャップを埋めるFusionアルゴリズムで使用できるように、構造体に関する邪悪な情報を生成します。

ここで、データをシリアライズおよびデシリアライズできるものが必要です。デシリアライゼーションは通常は少し難しくなりますが、ここではポリモーフィズムがないという利点があります(これは常に困難になります)。

通常、最初のパスでシリアル化するオブジェクトのグラフを識別し、すべてのIDを割り当て、シリアル化するときにポインタの代わりにこのIDを使用します。デシリアライズのために、あなたは3列マップを使用します。

  • マップがIDである - >(割り当てられたオブジェクトへのポインタ、設定することができませんでしたポインタのリスト)
  • が持つIDのマップを埋め、すべてのオブジェクトを割り当てます毎回割り当てられたオブジェクトへのポインタ
  • IDを逆シリアル化する必要があるときは、マップ内でそれを見つけます。存在しない場合は、対応するリストにポインタを置きます。
  • ポインタを割り当てられたオブジェクトに置くと地図では、すべての '設定されていない'ポインタを埋める時間がかかる(同時にリストを削除する)

もちろん、フレームワークで処理する方がよいでしょう。 s11nを試してみてください。正しく覚えていれば、参照サイクルが処理されます。

+0

これらのブーストマクロはコードがあまりにも醜いとエイリアンになります。 IMOでは、反射のための最善のアプローチはコード生成です。 –

+0

@マキシム:それでは、同意に同意する必要があります。これらのマクロの主な利点は、事実後に追加することができ、制御しない構造体で使用できることです。特に、この(単純な)ケースでは、コード生成を避けてはいけません。しかし、実際のクラスを扱うときには、コード生成をお勧めしません。これは本当に厄介な傾向があります.->私はまだ別の言語を学び、私の表現力をジェネレータで減らすことは無益です。迂回の層が増えるほど、あなたがしていることを制御することが難しくなります。 –

関連する問題