【发布时间】:2019-08-12 11:42:15
【问题描述】:
我可以使用 boost::serialization 通过抽象基础序列化对象。但是,当我尝试添加反序列化时,会收到关于抽象库的编译错误。这是我的有效序列化代码:
/*
g++ -Iinclude/ -Llib -lboost_serialization ~/Desktop/ser_ex.cpp -o stest
*/
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <boost/serialization/export.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <memory>
namespace bser = boost::serialization;
using namespace std;
namespace foo {
class AA
{
public:
virtual void foo() = 0;
virtual ~AA() {}
std::string name;
template<class Archive>
void serialize(Archive & ar, unsigned int )
{
ar & name;
}
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT( AA );
class BB : public AA
{
public:
virtual void foo() = 0;
virtual void bar() = 0;
virtual ~BB () {}
int thing;
template<class Archive>
void serialize(Archive & ar, unsigned int )
{
ar.template register_type< AA >();
ar & boost::serialization::base_object<AA>(*this);
ar & thing;
}
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT( BB );
class CC : public BB
{
public:
virtual void foo() {}
virtual void bar() {}
virtual ~CC() {}
int otherThing;
template<class Archive>
void serialize(Archive & ar, unsigned int )
{
ar.template register_type< BB >();
ar & boost::serialization::base_object<BB>(*this);
ar & otherThing;
}
};
}
BOOST_CLASS_EXPORT_KEY(foo::CC)
BOOST_CLASS_EXPORT_IMPLEMENT(foo::CC)
int main (int , char const **)
{
std::vector< shared_ptr<foo::AA> > vv;
vv.push_back( make_shared<foo::CC>() );
std::ostringstream oss;
boost::archive::binary_oarchive out_archive( oss );
out_archive << vv;
std::cout << oss.str() << std::endl;
}
只需将这一行添加到 binary_oarchive.hpp 的 include 正下方,就会导致代码无法编译。
#include <boost/archive/binary_iarchive.hpp>
dawilcox-macOS:debug dawilcox$ make foo
dependencies: foo_main.o
building: foo_main.o
In file included from /Users/dawilcox/src/axle/foo_main.cpp:5:
In file included from /usr/local/include/boost/serialization/serialization.hpp:43:
/usr/local/include/boost/serialization/access.hpp:130:17: error: allocating an object of abstract class type 'foo::AA'
::new(t)T;
Boost 抱怨它无法实例化我的基本类型。这就是重点——它是一个抽象基类型。
反序列化抽象基的正确方法是什么?
【问题讨论】:
-
我不熟悉这个库,但从概念上讲你不能反序列化一个抽象基。反序列化意味着创建一个抽象类型不可能的实例。您需要反序列化为实际的派生类型。也许您的意思是反序列化派生类型的基本部分,这在反序列化派生类型的上下文中很好。
-
我不是很肯定,但我在文档中看到了很多注释,您需要将它们反序列化到您序列化的同一类中。文档中还提到了很多抽象类以及一些关于抽象的宏(请参阅上面我使用的宏)。由于这些原因,如果 boost 不支持这一点,我会感到有点惊讶。这有点奇怪。
标签: c++ serialization boost polymorphism deserialization