私は同様の質問を読みましたが、答えは見つかりませんでした。私はVisual Studio 2010を使い、1.47を増やしています。ここで派生オブジェクトのブーストシリアライゼーションは、派生のserialize()を呼び出さない
はコードですが、それは完全でコンパイル可能です:
#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を作ることになっていますBOOST_CLASS_EXPORTとoa.register_typeの魔法を追加しました::シリアライズ()仮想メソッドではないにもかかわらず呼び出されますが、依然としてBaseObjectのserialize()だけが呼び出されます。おそらくVisual C++固有の問題ですか?ご意見をお聞かせください?
'BaseObject :: serialize'は' virtual'としてマークされるべきではありませんか? – Nick
テンプレートはありません。 –
良い点 - テンプレートビットに気付かなかった! – Nick