2

ポリモーフィック クラスのブースト シリアル化が機能していないようです (1.40+ ブースト)。たとえば、次のコードでは、クラスをエクスポートするという規則に従っていると思います。gcc4.4 (ubuntu) と Windows VS2010 (ブースト 1.48) の両方で試しました。 : 次のプログラムでは、10 と 100 の両方が出力されると思われますが、10 しか出力されません。つまり、基本クラスのみをシリアル化したということです。

私は主にブーストのドキュメントから例をコピーしましたが、まだ機能しません。誰かが何か考えがありますか?どうもありがとうLS

#include <iostream>
#include <sstream>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
#define NVP(X) X

class base {
public:
friend class boost::serialization::access;
base (){ v1 = 10;}
int v1;
template<class Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
    ar & NVP(v1);
}
};


class derived : public base {
public:
friend class boost::serialization::access;
int v2 ;
derived() { v2 = 100;}
template<class Archive>
void serialize(Archive & ar, const unsigned int file_version){
    boost::serialization::base_object<base>(* this);
    ar & NVP(v2);
}
};
BOOST_CLASS_EXPORT(base);
BOOST_CLASS_EXPORT_GUID(derived, "derived");


int main ( ) 
{
std::stringstream ss;
boost::archive::text_oarchive ar(ss);
base *b = new derived();
ar << NVP(b);
std::cout << ss.str();
}
4

1 に答える 1

6

あなたが忘れてしまった

virtual ~base() {}

これは、ポリモーフィックなシリアライゼーションが機能するために必要なだけでなく (それがないと、クラスはポリモーフィックではありません)、48 州ではそれを省略することは軽罪であると私は信じています。IANAL、YMMV。

ああ、そうあるべきですar & boost::serialization::base_object<...>

于 2012-04-30T21:00:05.020 に答える