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
导出.cpp
#include <boost/serialization/export.hpp>
#include "shapes.hpp"
#ifdef EXPORT_IN_OBJECT
BOOST_CLASS_EXPORT(Rect)
#endif
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;
}
在gcc上,我使用以下命令编译:
g++ -omain main.cpp export.cpp -Wl,-Bstatic -lboost_serialization-mt -Wl,-Bdynamic -DEXPORT_IN_XXX
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
展开为一个模板特化(我们希望它在头文件中),但也展开为其中的静态成员定义。因此,我会得到关于boost::archive::detail::init_guid<Rect>::guid_initializer
的多重定义链接器错误。
如果有影响的话,我正在使用 g++ 4.4.3 和 Boost 1.40。
boost::archive::detail::init_guid<SomeClass>::guid_initializer
错误。 我感到相当困惑,所以如果你已经解决了这个问题,我会非常感激你的分享!谢谢! - bguiz