yoc*_*oco 3 boost boost-serialization
我boost::serialization在我的项目中使用.该项目很大,并在几个地方序列化我的对象.根据这里的文档,我应该用两个单独的步骤导出我的类.
BOOST_EXPORT_KEY()在.h文件中,女巫包含声明.BOOST_EXPOET_IMPLEMENT()在.cpp文件中,witch包含导出的实例化(定义).hier.h 在类层次结构中,层次结构中有3个类.
/*
B <---+--- D1
|
+--- D2
*/
#include <boost/serialization/base_object.hpp>
class B {
public:
virtual ~B() {}
template < typename Ar >
void serialize(Ar& ar, const int) {
}
} ;
class D1 : public B {
public:
virtual ~D1() {}
template < typename Ar > void serialize(Ar& ar, const int) {
boost::serialization::base_object<B>(*this);
}
} ;
class D2 : public B {
public:
template < typename Ar > void serialize(Ar& ar, const int) {
boost::serialization::base_object<B>(*this);
}
virtual ~D2() {}
} ;
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY(B);
BOOST_CLASS_EXPORT_KEY(D1);
BOOST_CLASS_EXPORT_KEY(D2);
Run Code Online (Sandbox Code Playgroud)
并且hier.cpp包含实现:
#include <boost/serialization/export.hpp>
#include "hier.h"
BOOST_CLASS_EXPORT_IMPLEMENT(D1);
BOOST_CLASS_EXPORT_IMPLEMENT(D2);
Run Code Online (Sandbox Code Playgroud)
并main.cpp使用序列化:
#include <iostream>
#include <sstream>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/export.hpp>
#include "hier.h"
int main(int argc, char* argv[])
{
B* d1 = new D1();
B* d2 = new D2();
std::ostringstream os;
boost::archive::text_oarchive oa (os);
oa & d1 & d2;
}
Run Code Online (Sandbox Code Playgroud)
它编译没有任何问题,但运行它将导致:
terminate called after throwing an instance of 'boost::archive::archive_exception'
what(): unregistered class - derived class not registered or exported
Run Code Online (Sandbox Code Playgroud)
这意味着派生类未注册,意味着注册中的hier.cpp不可用.但这真的很奇怪,因为:
如果我注册实现是main.cpp和hier.cpp,并且它在链接时发出重复的定义.表示注册hier.cpp正常并且暴露在链接器可见性中.,否则不会出现重复的定义错误.
如果我只注册实现main.cpp,它运行正常.
在那种情况下我真的很困惑.任何评论和建议表示赞赏.提前致谢.
在致电之前,BOOST_CLASS_EXPORT_*您应该包括您要使用的档案.然后makro为标题添加特定的序列化函数.
这意味着您应该将代码更改hier.cpp为以下内容:
#include <boost/serialization/export.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include "hier.h"
BOOST_CLASS_EXPORT_IMPLEMENT(D1);
BOOST_CLASS_EXPORT_IMPLEMENT(D2);
Run Code Online (Sandbox Code Playgroud)
代码hier.h会相应更改:
#include <boost/serialization/export.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
BOOST_CLASS_EXPORT_KEY(B);
BOOST_CLASS_EXPORT_KEY(D1);
BOOST_CLASS_EXPORT_KEY(D2);
Run Code Online (Sandbox Code Playgroud)
来源:
Boost Serializsation Documentation
PS:
我不知道这是否解决了你的问题,但我认为这可能会造成一些麻烦.我觉得值得一试.
| 归档时间: |
|
| 查看次数: |
4008 次 |
| 最近记录: |