3

ポリモーフィック ベクターを (デ) シリアル化しようとしていますが、さまざまな試行でさまざまな問題があります。イベントの全体的な順序は次のとおりです。

  • サーバー側でポリモーフィック ベクターをシリアル化する
  • シリアル化された文字列をネットワーク経由で送信する
  • クライアント側で新しいポリモーフィック ベクターに逆シリアル化する
  • クライアント側でのベクター内のデータの編集 (追加、編集、および削除を含む)
  • 編集したポリモーフィック ベクターをクライアント側でシリアル化する
  • 新しいシリアル化された文字列をネットワーク経由で送信する
  • サーバー側で新しいポリモーフィック ベクターを逆シリアル化します <---ここに問題があります

クラス Base から派生した Class Derived (および DerivedB、DerivedC など) と、Virtual Base の Vector を保持する Class SetsOfBases があります。

ただし、これがどのように問題を引き起こしているのかはわかりません。私の問題は、サーバーからのベクター内のオブジェクトが特定の順序 (AAABBCCCCD) であり、戻ってきたときにランダムな順序になっているためだと思います。派生クラス (ABABCDDDA) の数が異なる場合があります。

以下は私の失敗した試みです。以下の方法 2 を使用すると、が良ければ (クラスの順序が同じであれば) 情報をやり取りできますが、クラス タイプの順序が変わると、問題が発生し始めます。

使用コード & コンパイル/ランタイム エラー:

  1. もちろん、追加なしでコンパイルしますが、Boost はどのクラスがどれであるかを認識しないため、ランタイムの問題が発生します...だから私は試しました:

  2. ar.template register_type<Derived>() ;- "LotsOfBases.h" の Serialize Function にクラスを登録Error @ RunTime: what(): Input Stream Errorし、RunTime で呼び出されたときに次のようになりました: - これは私が最も成功した場所であり、主に上記の内容です。

  3. ar.register_type<static...しかし、関数であることを示すコンパイルエラーが発生します(StackOverflowの他の場所でこれを見ました

  4. BOOST_CLASS_EXPORT(Derived) ;「.h」ファイルの最後に、Base の異なるサブクラスごとにn 個の警告が表示され、コンパイルに失敗します。エラー:multiple definition of ``boost::archive::detail::extra_detail::init_guid<Derived>::g'

  5. SetsOfBases が Deserialized されるメインのアーカイバーにクラスを登録しようとしました。コンパイラの警告

  6. BOOST_CLASS_EXPORT_IMPLEMENT(TextQuestion)クラスのシリアライゼーションのエクスポートから- 6 iirc と同じエラー。

  7. 上記のリンクなしの例は、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 ;
    }

きっとそんなに難しくないはずです。だから、私の質問だと思います...私は何が間違っていますか? どこから読んだり研究したりし始めるべきですか?

4

1 に答える 1