Tho*_*mas 12 c++ boost-serialization
我正在尝试序列化指向多态类的指针Shape.所以我需要使用BOOST_CLASS_EXPORT宏来为每个子类定义一个GUID.问题:在哪里放?
让我先展示一个最小的测试用例:
shapes.hpp
#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/export.hpp>
class Shape {
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive &ar, unsigned int const version) {
// nothing to do
}
public:
virtual ~Shape() { }
};
class Rect : public Shape {
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive &ar, unsigned int const version) {
ar & boost::serialization::base_object<Shape>(*this);
}
public:
virtual ~Rect() { }
};
#ifdef EXPORT_IN_HEADER
BOOST_CLASS_EXPORT(Rect)
#endif
Run Code Online (Sandbox Code Playgroud)
export.cpp
#include <boost/serialization/export.hpp>
#include "shapes.hpp"
#ifdef EXPORT_IN_OBJECT
BOOST_CLASS_EXPORT(Rect)
#endif
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include <iostream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/export.hpp>
#include "shapes.hpp"
#ifdef EXPORT_IN_MAIN
BOOST_CLASS_EXPORT(Rect)
#endif
int main() {
Shape *shape = new Rect();
boost::archive::text_oarchive ar(std::cout);
ar << shape;
}
Run Code Online (Sandbox Code Playgroud)
在gcc上,我用这些编译它们
g++ -omain main.cpp export.cpp -Wl,-Bstatic -lboost_serialization-mt -Wl,-Bdynamic -DEXPORT_IN_XXX
Run Code Online (Sandbox Code Playgroud)
在这里,export.cpp可能看起来有点傻.在我的实际情况中,它包含一个使用PIMPL惯用语的封闭类,并尝试序列化其(多态)Shape实现.重要的是:BOOST_CLASS_EXPORT可以在与调用序列化的代码不同的目标文件中.
所以这就是问题:在哪里使用BOOST_CLASS_EXPORT?我有三个选项,可以使用EXPORT_IN_XXX宏启用.
EXPORT_IN_MAIN有效,但不是我想要的.调用序列化的代码不需要知道PIMPL类的实现细节.
EXPORT_IN_OBJECT编译,但不起作用:它导致boost::archive::archive_exception与消息unregistered void cast.根据文档,这应该通过使用boost::serialization::base_object像我一样序列化基类来解决,但它没有帮助.
EXPORT_IN_HEADER甚至没有编译.宏BOOST_CLASS_EXPORT扩展为模板特化(我们希望在头文件中),但也扩展到其中的静态成员的定义.所以我得到一个关于a的链接器错误multiple definition of 'boost::archive::detail::init_guid<Rect>::guid_initializer'.
如果重要的话,我正在使用g ++ 4.4.3和Boost 1.40.
导出 Boost.Serialization文档的类序列化(1.44.0)声明如下:
BOOST_CLASS_EXPORT在包含任何归档类头的同一源模块中,将实例化代码[...]请注意,此功能的实现要求
BOOST_CLASS_EXPORT宏出现在后面,并包含要为其实例化代码的任何归档类头.因此,使用的代码BOOST_CLASS_EXPORT如下所示:
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
... // other archives
#include "a.hpp" // header declaration for class a
BOOST_CLASS_EXPORT(a)
... // other class headers and exports
Run Code Online (Sandbox Code Playgroud)
[...]包含
BOOST_CLASS_EXPORT在"a.hpp"标题本身中与其他序列化特征一样,将使得在BOOST_CLASS_EXPORT调用之前遵循上述关于包含存档标题的规则变得困难或不可能 .通过BOOST_CLASS_EXPORT_KEY在头部声明和BOOST_CLASS_EXPORT_IMPLEMENT类定义文件中使用,可以最好地解决这个问题 .
我最终将所有序列化代码放在一个标题中s11n.h,该标题包含在调用序列化的CPP文件中.本质上,EXPORT_IN_MAIN我在上面概述了这个场景,但是BOOST_CLASS_EXPORT在不同的文件中进行了宏调用.
只有当只有一个编译单元包含时s11n.h,这才有效,所以尽管它现在有用,但它并不是真正的解决方案......
| 归档时间: |
|
| 查看次数: |
12425 次 |
| 最近记录: |