1

私は自分のアプリケーションで使用boost::variantboost::serializeています。シリアル化モジュールには、バリアントのシリアル化のサポートが組み込まれているため、次のようになります。

boost::variant<int,double> u(3.14);

// Do something with u;

// Serialize
oa << u;

動作します。ただし、私の問題は、シリアル化が堅牢ではないことです。アプリケーションのコンパイル方法に応じて、バリアントの要素が変わる可能性があります。現在、シリアル化モジュールは、「アクティブな」バリアント型のインデックスを単に埋め込んでいるように見えます。これは、バリアントがたとえばに変更された場合の問題ですboost::variant<double,string>

シリアル化されたタイプがのテンプレートパラメータであるようにシリアル化/非シリアル化が機能するように、これを改善する方法を誰かが提案できますかboost::variant?(したがって、上記の場合、boost::variant<int,double> u(3.14)シリアル化されていないboost::variant<double,std::string>可能性があります。これには、型の文字列形式などの追加情報を提供する必要がある場合があることを認識しています。

4

1 に答える 1

3

そのようなもののための既製のメカニズムはどのように機能しますか?boost::variant<int,double>たとえば、ダブルに変更しboost::variant<int,std::string>てダブルを保持できなくなった場合はどうすればよいですか?例外をスローしますか?

そのようなものが必要な場合は、予想しているケースをカバーし、「ロバスト」の定義に合わせるために、自分で作成する必要があると思います。

また、ファイルアップグレードロジックを組み込むこともできます...たとえば、プログラムのすべてのバージョンNは、(N-1、N-2 ...)の構造体の定義の古いコピーを保持しているため、次のように記述できます。遭遇した古いファイルをアップグレードする機能を提供するために使用できるルーチン。

しかし、実際には、プログラムを公開する前に、できるだけ最初からファイル形式を正しくするのが最善です。特に、ユーザーの意図をエンコードするデータ(事実上キャッシュにすぎない派生構造は、バージョンがそれらを認識しない場合、破棄して再計算することができます)。

于 2011-11-08T15:47:46.310 に答える