ポリモーフィック ベクターを (デ) シリアル化しようとしていますが、さまざまな試行でさまざまな問題があります。イベントの全体的な順序は次のとおりです。
- サーバー側でポリモーフィック ベクターをシリアル化する
- シリアル化された文字列をネットワーク経由で送信する
- クライアント側で新しいポリモーフィック ベクターに逆シリアル化する
- クライアント側でのベクター内のデータの編集 (追加、編集、および削除を含む)
- 編集したポリモーフィック ベクターをクライアント側でシリアル化する
- 新しいシリアル化された文字列をネットワーク経由で送信する
- サーバー側で新しいポリモーフィック ベクターを逆シリアル化します <---ここに問題があります
クラス Base から派生した Class Derived (および DerivedB、DerivedC など) と、Virtual Base の Vector を保持する Class SetsOfBases があります。
ただし、これがどのように問題を引き起こしているのかはわかりません。私の問題は、サーバーからのベクター内のオブジェクトが特定の順序 (AAABBCCCCD) であり、戻ってきたときにランダムな順序になっているためだと思います。派生クラス (ABABCDDDA) の数が異なる場合があります。
以下は私の失敗した試みです。以下の方法 2 を使用すると、運が良ければ (クラスの順序が同じであれば) 情報をやり取りできますが、クラス タイプの順序が変わると、問題が発生し始めます。
使用コード & コンパイル/ランタイム エラー:
もちろん、追加なしでコンパイルしますが、Boost はどのクラスがどれであるかを認識しないため、ランタイムの問題が発生します...だから私は試しました:
ar.template register_type<Derived>() ;
- "LotsOfBases.h" の Serialize Function にクラスを登録Error @ RunTime: what(): Input Stream Error
し、RunTime で呼び出されたときに次のようになりました: - これは私が最も成功した場所であり、主に上記の内容です。ar.register_type<static...
しかし、関数であることを示すコンパイルエラーが発生します(StackOverflowの他の場所でこれを見ましたBOOST_CLASS_EXPORT(Derived) ;
「.h」ファイルの最後に、Base の異なるサブクラスごとにn 個の警告が表示され、コンパイルに失敗します。エラー:multiple definition of ``boost::archive::detail::extra_detail::init_guid<Derived>::g'
SetsOfBases が Deserialized されるメインのアーカイバーにクラスを登録しようとしました。コンパイラの警告
BOOST_CLASS_EXPORT_IMPLEMENT(TextQuestion)
クラスのシリアライゼーションのエクスポートから- 6 iirc と同じエラー。上記のリンクなしの例は、StackOverflow の約 30 ページをトローリングしたもので、似ていますが、提供されているソリューションは私にはうまくいかないようであるか、Boost Serialization と関係がありますが、やや無関係です。
以下は私のコードの短縮版です(他の場所から使用された編集なし):
クラスのコード
多くの塩基:
#include "s11n.h" //Import All Serialization Headers In Correct Order
namespace boost { namespace serialization { class access ; } }
class LotsOfBases
{
public:
std::vector<Base *> getAllBases() ;
protected:
std::vector<Base *> allBases() ;
friend class boost::serialization::access ;
template <typename Archive>
void serialize(Archive& ar, const unsigned int /*version*/)
{
ar & allBases ;
}
} ;
ベース:
#include "s11n.h" //Import All Serialization Headers In Correct Order
namespace boost { namespace serialization { class access ; } }
class Base
{
public:
Base() ;
~Base() ;
virtual std::string getBaseLocation() ;
protected:
std::string baseLocation ;
friend class boost::serialization::access ;
template <typename Archive>
void serialize(Archive& ar, const unsigned int /*version*/)
{
ar & baseLocation ;
}
} ;
派生
#include "s11n.h" //Import All Serialization Headers In Correct Order
namespace boost { namespace serialization { class access ; } }
class Derived
{
public:
Derived() ;
bool getIsAttackableBase() ;
private:
bool isAttackableBase ;
typedef Base _super;
friend class boost::serialization::access ;
template <typename Archive>
void serialize(Archive& ar, const unsigned int /*version*/)
{
ar & boost::serialization::base_object<_super>(*this) ;
ar & isAttackableBase ;
}
きっとそんなに難しくないはずです。だから、私の質問だと思います...私は何が間違っていますか? どこから読んだり研究したりし始めるべきですか?