来自抽象基础的次要化因增强序列化而失败
deserialization from an abstract base fails for boost serialization
我能够使用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 <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抱怨它不能实例化我的基本类型。这就是重点 - 这是一种抽象的基本类型。
应有什么理由化抽象基础的正确方法?
看起来我错了的是我在供应函数中对基类进行注册。所以,我摆脱了:
ar.template register_type< AA >();
和更改
ar.template register_type< BB >();
to
ar.template register_type< CC >();
这是我的完整代码:
/*
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/archive/binary_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <OMNIMAKE/lib/boost_serialization>
#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 & 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< CC >();
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;
}
相关文章:
- 增强基于 XML class_id的反序列化
- 增强序列化,按基类型加载存档类会产生错误的数据
- 增强多重继承的序列化
- 来自抽象基础的次要化因增强序列化而失败
- 如何更改或删除标签,以增强序列化
- 崩溃:分段故障:增强序列化加载 - 用null调用构造函数
- 在同一程序中使用谷物并增强序列化
- 使用指针增强序列化
- 如何增强序列化STL容器
- 增强序列化多态性类
- 增强动态阵列的序列化
- 增强多边形序列化:环
- 多个库并增强序列化
- 增强序列化-启用对象跟踪
- 在取消引用的基类指针上增强序列化
- c++增强序列化如何防止不正确的文件崩溃
- 跟踪何时为增强序列化添加数据成员
- 链接到增强序列化时出错
- 处理可能的空指针的类的增强序列化
- 增强序列化-在反序列化损坏数据时不再出现archive_exception