6

Boost.Serialization を初めて検討していますが、仮想ダイヤモンド継承構造のシリアル化に関する明確な評価 (または指示) が見つかりません。

次のクラス階層を検討してください。

class A { int a; }

class B1 : public virtual A { int b1; }

class B2 : public virtual A { int b2; }

class B3 : public virtual A { int b3; }

class C12 : public virtual B1, public virtual B2 { int c12; }

class C13 : public virtual B1, public virtual B3 { int c13; }

class C23 : public virtual B2, public virtual B3 { int c23; }

class D123 : public virtual C12, public virtual C13, public virtual C23 { int d123; }

Boost.Serialization を使用して、これらすべてのクラス内でシリアライゼーションを実装する適切な (できれば簡単な) 方法は何ですか?

注: シリアル化する必要があるポインターまたは参照クラス メンバーはありません。dynamic_cast<>また、注意してください:この階層内の任意のクラスへのポインターまたは参照が、目的の最も派生した型であることを保証するために喜んで使用します。メンバーは、シリアル化されている現在のクラスと共に、適切にシリアル化および逆シリアル化されます。

4

1 に答える 1

2

オブジェクトを仮想基底クラスでシリアル化する場合、仮想基底クラスのオブジェクト トラッキングを明示的に有効にする必要があります。

BOOST_CLASS_TRACKING(virtual_base, boost::serialization::track_always)

オブジェクト追跡から:

仮想基本クラスを持つダイヤモンド ヘリタンス構造では、オブジェクト トラッキングにより冗長な保存/読み込み呼び出しが防止されます。ここでは、デフォルトのトラッキング トレイトをオーバーライドすると便利なケースを 1 つ示します。(注: 将来のバージョンでは、仮想ベースとして使用されるクラスを自動的に追跡するようにデフォルトが再実装される予定です)。

基本クラスの逆シリアル化については、次を使用します。

archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);

メンバー変数 ( archive & BOOST_SERIALIZATION_NVP(variable)) を侵入的シリアライゼーションでシリアライズする前。邪魔にならないシリアル化の場合、関連するすべてのメンバー変数を処理するのはあなた次第です。

これはすべて、最も派生した型のポインターまたは参照を使用して、非ポリモーフィック クラス (仮想基底クラスを使用) を逆シリアル化するという前提に基づいています。

于 2012-11-19T06:03:53.627 に答える