我有三门课:
class A
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & this->id & this->somefield;
}
protected:
A() {} // just for boost, normally I create this class with non-default constructor
int id;
Sometype somefield;
public:
A(unsigned int id);
// blah blah, also some virtual methods
};
// _____________________ CLASS B
class B : public A
{
private:
friend class boost::serialization::access;
template<class Archive> inline friend void load_construct_data(Archive &ar, B *t, const unsigned int file_version);
template<class Archive> inline friend void save_construct_data(Archive &ar, const B *t, const unsigned int file_version);
B(unsigned int id, Sometype somefield, Sometype some_new_field1, Sometype some_new_field2);
Sometype some_new_field1;
Sometype some_new_field2;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & boost::serialization::base_object<A>(*this);
}
public:
// blah blah, also virtual methods
};
template<class Archive>
inline void save_construct_data(
Archive & ar, const B * t, const unsigned int file_version
){
ar << t->id << t->somefield << t->some_new_field1 << t->some_new_field2;
}
template<class Archive>
inline void load_construct_data(
Archive & ar, B * t, const unsigned int file_version
){
unsigned int _id;
Sometype _somefield;
Sometype _some_new_field1;
Sometype _some_new_field2;
ar >> _id >> _somefield >> _some_new_field1 >> _some_new_field2;
::new(t)B(_id, _somefield, _some_new_field1, _some_new_field2);
}
// _____________________ CLASS C
class C : public A
{
private:
friend class boost::serialization::access;
template<class Archive> inline friend void load_construct_data(Archive &ar, C *t, const unsigned int file_version);
template<class Archive> inline friend void save_construct_data(Archive &ar, const C *t, const unsigned int file_version);
C(unsigned int id, Sometype somefield, Sometype some_new_field3, Sometype some_new_field4);
Sometype some_new_field3;
Sometype some_new_field4;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & boost::serialization::base_object<A>(*this);
}
public:
// blah blah, also virtual methods
};
template<class Archive>
inline void save_construct_data(
Archive & ar, const C * t, const unsigned int file_version
){
ar << t->id << t->somefield << t->some_new_field3 << t->some_new_field4;
}
template<class Archive>
inline void load_construct_data(
Archive & ar, C * t, const unsigned int file_version
){
unsigned int _id;
Sometype _somefield;
Sometype _some_new_field3;
Sometype _some_new_field4;
ar >> _id >> _somefield >> _some_new_field3 >> _some_new_field4;
::new(t)C(_id, _somefield, _some_new_field3, _some_new_field4);
}我需要使用非默认的构造函数,所以我需要load/save_data重写。类B和C是通过向量序列化和反序列化的,因此我使用宏BOOST_CLASS_EXPORT() (在代码的另一部分中,我想这与代码无关)。我的问题是,当我反序列化使用上述代码生成的存档时,我会在向量中得到重复的指针(每个指针指向内存中的相同区域)--它可能是一个基本指针,另一个是派生clas指针。当通过指向基类的指针保存对象时,我在任何地方都找不到如何使用load/save数据,而不需要复制。我在这个问题上花了几个星期,我的截止日期很快就要到了,任何帮助都非常感谢:)
编辑:我还应该再提一件事:当我从基类中删除“序列化”方法的内容时(只有内容,而不是方法本身),在反序列化之后我什么也得不到,当我删除带有"base_object“的部分时,归档会抛出一个异常”未注册的空强制转换“。
发布于 2013-01-04 14:05:06
Boost手册制作得不太好,我在“模板序列化”部分找到了答案:)
我只需将基类的序列化方法保留为空白,而在派生类中,序列化方法将
boost::serialization::void_cast_register<derived, base>();为了将来的参考-现在一切正常:)
https://stackoverflow.com/questions/14146393
复制相似问题