首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost的load_construct_data和通过指向基的指针序列化派生类

问boost的load_construct_data和通过指向基的指针序列化派生类
EN

Stack Overflow用户
提问于 2013-01-03 20:07:21
回答 1查看 1.7K关注 0票数 2

我有三门课:

代码语言:javascript
复制
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“的部分时,归档会抛出一个异常”未注册的空强制转换“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-04 14:05:06

Boost手册制作得不太好,我在“模板序列化”部分找到了答案:)

我只需将基类的序列化方法保留为空白,而在派生类中,序列化方法将

代码语言:javascript
复制
boost::serialization::void_cast_register<derived, base>();

为了将来的参考-现在一切正常:)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14146393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档