6

同様の質問をたくさん読みましたが、答えが見つかりませんでした。Visual Studio 2010 とブースト 1.47 を使用しています。

コードは次のとおりです。完全でコンパイル可能です。

#include "stdafx.h"

#include <string>
#include <sstream>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

#include <boost/serialization/export.hpp>

using namespace std;

class BaseObject 
{
public:

    BaseObject(void) { };
    virtual ~BaseObject(void) { };

    template<class Archive>
      void serialize(Archive &ar, const unsigned int version)
      { /* nothing happens here */  };
};

class DerivedObject : public BaseObject
{
public:

    string text;

public:

    DerivedObject(void) { };
    ~DerivedObject(void) { };

    template<class Archive>
      void serialize(Archive &ar, const unsigned int version)
      {
          ar & text;
      };
};

BOOST_CLASS_EXPORT(DerivedObject)

int _tmain(int argc, _TCHAR* argv[])
{
    DerivedObject der;
    der.text = "Testing!";

    std::ostringstream os;
    boost::archive::text_oarchive oa(os);
    oa.register_type<DerivedObject>();

    // I made a DerivedObject, but I'm casting it to a BaseObject
    // as the serialization code should not have to know what type it is
    BaseObject *base = &der;
    // now serialize it
    oa << *base;

    printf("serialized: %s\r\n",os.str().c_str()); 

    return (0);
}

本当に単純であることがわかります。仮想メソッドではなくても、DerivdObject::serialize() が確実に呼び出されるようにする BOOST_CLASS_EXPORT および oa.register_type マジックを追加しました。 BaseObject が呼び出されます。おそらくVisual C++に固有の問題ですか?ご意見をお聞かせください?

4

3 に答える 3

2

As described in the boost serialization documentation you need to tell your derived class to call the base class serialization code. Just write your derived class serialize method like this :

  template<class Archive>
  void serialize(Archive &ar, const unsigned int version)
  {
      ar & boost::serialization::base_object<BaseObject>(*this);
      ar & text;
  };
于 2013-03-28T11:53:01.930 に答える
0

これは厳密には答えではありません。

基本クラスに次を追加します。

virtual void StreamToArchive(boost::archive::text_oarchive &oa) = 0;

次に、マクロ STREAMTOARCHIVE を定義し、それをすべての派生クラスに配置します。

#define STREAMTOARCHIVE void StreamToArchive(boost::archive::text_oarchive &oa) { oa << *this; }

次に、メインで、置き換えます

oa << base;

base.StreamToArchive(oa);

ええ、それは醜いことは知っていますが..うまく機能し、そのSTREAMTOARCHIVEマクロを派生クラスに配置するだけです...私はそれで暮らすことができます...

しかし、それを解析してオブジェクトに戻すには、それは別の問題です...

編集: 「これ」を「*これ」に変更

于 2012-03-16T21:11:06.543 に答える
0

デバッガーなどでこれを試したことはありませんが、スライスの場合のようです。おそらく、値ではなくポインターまたは参照によってシリアル化するようにコードを変更することで見つけることができます...

BaseObject *base = &der;
oa << base;  // Serialize a pointer

...また...

BaseObject& base = der;
oa << base;  // Serialize a reference
于 2012-03-16T06:15:09.803 に答える