使用Boost序列化向前声明类和继承

Use Boost serialization with forward declaration class and inheritance

本文关键字:继承 声明 Boost 序列化 使用      更新时间:2023-10-16

我使用boost序列化来存储和加载几个类。我的目标是在一个包含其他类的类上使用序列化,这样其他类就会被序列化。

但是问题是这些类包含前向声明和继承,我不能对这些类进行boost序列化。

我在编译中有一个问题,特别是在前向声明上,有这些错误:

error: invalid use of incomplete type ‘class C’
error: forward declaration of ‘class C’
error: ‘value’ is not a member of ‘boost::is_polymorphic<C>’
...
谁能告诉我我的代码有什么问题?我错过什么了吗?我的代码序列化派生和前向声明类正确吗?

A.h:

#include <boost/serialization/access.hpp>
#include <boost/serialization/vector.hpp>
class B;
class C;
class A {
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & m_Bvector;
    }
protected:
    vector<B*> m_Bvector;
    vector<C*> m_Cvector;
/*....*/
}

注意:m_Bvector可以包含B*或/和C*对象

B.h:

#include <boost/serialization/access.hpp>
#include "A.h"
class B {
private : 
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & m_someInt;
    }
protected :
    int m_someInt;
/*....*/
}

刘昀:

#include <boost/serialization/base_object.hpp>
#include "B.h"
classe C : public B {
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & boost::serialization::base_object<B>(*this);
        ar & m_someOtherInt;
    }
protected:
     int m_someOtherInt;
/*....*/

}

这是我调用save和load函数的方法:

SerializationManager.h:

#include <A.h>
#include <C.h>
#include <boost/serialization/export.h>
BOOST_CLASS_EXPORT(C);
class SerializationManager {
    /*....*/
public:
    bool save(string filename);
    bool load(string filename);
protected:
    A* m_classToSave;
}

SerializationManager.cpp:

#include "SerializationManager.h"
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <fstream>
#include <sstream>
bool SerializationManager::save(string filemname)
{
    std::ofstream outputFile(filemname);
    assert(outputFile.good());
    boost::archive::text_oarchive oTextArchive(outputFile);
    oTextArchive << m_classToSave;
    return true;
}
bool SerializationManager::load(string filename)
{
    delete m_classToSave;
    std::ifstream ifs( filename );
    assert(ifs.good());
    boost::archive::text_iarchive ia(ifs);
    // restore the schedule from the archive
    ia >> m_classToSave;
    return true;
}
/* ... */

Boost需要知道类型是否是虚拟的(有任何虚拟方法,即通常用虚函数表实现),所以它可以依靠typeiddynamic_cast返回运行时保真度值。

您试图在类型定义可用之前实例化序列化机制(仅前声明类型是不完整的),因此它无法生成序列化代码。