我正在寻找一个(工作)的例子,用于在DLL中从外部序列化一个类结构。目前我无法找到任何示例。 Boost文档只是陈述一些宏,论坛和新闻组只是在讨论他们的解决方案的具体问题。把一个类的序列化成一个DLL
所以我要求一个例子(外部)序列化一个类结构如下。与类代码一起,我添加了一些我的序列化代码(这不起作用,请参阅底部的错误消息)。
class Foo
{
public:
Foo() { number_ = 0; }
virtual ~Foo() {}
int getNumber() { return number_; }
void setNumber(int var) { number_ = var; }
private:
int number_;
};
class Bar : public Foo
{
public:
Bar() { doubleNumber_ = 0.0; }
virtual ~Bar() {}
double getDouble() { return doubleNumber_; }
void setDouble(double var) { doubleNumber_ = var; }
private:
double doubleNumber_;
};
所有的东西我有,到目前为止是这样的代码:
serializeFoo.h
#ifndef _SERIALIZE_FOO_H_
#define _SERIALIZE_FOO_H_
#include "Foo.h"
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/version.hpp>
namespace boost {
namespace serialization {
template <typename Archive>
void save(Archive& ar, const Foo& object, const unsigned int version)
{
ar << object.getNumber();
}
template <typename Archive>
void load(Archive& ar, Foo& object, const unsigned int version)
{
int number;
ar >> number;
object.setNumber(number);
}
}} //namespace brackets
BOOST_SERIALIZATION_SPLIT_FREE(Foo)
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY(Foo)
#endif //_SERIALIZE_FOO_H_
serializeFoo.cpp
#include "serializeFoo.h"
BOOST_CLASS_EXPORT_IMPLEMENT(Foo)
seriali zeBar.h:
#ifndef _SERIALIZE_BAR_H_
#define _SERIALIZE_BAR_H_
#include "Bar.h"
#include <boost/serialization/split_free.hpp>
#include <boost/serialization/version.hpp>
namespace boost {
namespace serialization {
template <typename Archive>
void save(Archive& ar, const Bar& object, const unsigned int version)
{
ar << base_object<Foo>(object);
ar << object.getDouble();
}
template <typename Archive>
void load(Archive& ar, Bar& object, const unsigned int version)
{
double doubleNumber;
ar >> doubleNumber;
object.setDouble(doubleNumber);
}
}} //namespace brackets
BOOST_SERIALIZATION_SPLIT_FREE(Bar)
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT_KEY(Bar)
#endif //_SERIALIZE_BAR_H_
serializeBar.cpp:
#include "serializeBar.h"
BOOST_CLASS_EXPORT_IMPLEMENT(Bar)
的序列码进入一个DLL,应在使用类Foo和Bar另一个项目中使用。一切编译好,但在运行时我得到的消息
unregistered class - derived class not registered or exported
所以,我用错了宏吗?我错过了一个宏吗?上述代码是否正确或存在某种结构性错误?也许这对许多其他人也有用,我不认为将类的序列化放入DLL是非常奇特的...
我在Boost-docs上看到的是'BOOST_SERIALIZATION_FACTORY_0(Foo)',但我不知道是否需要它,以及我是否应该使用它。链接:http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/special.html#dlls – MOnsDaR 2012-02-08 07:54:29
好吧,如果它让你感觉更好,我有一个项目,它工作得很好,并且代码看起来与您所拥有的完全相同,除了我将归档头文件包含在头文件顶部之外。附:它在技术上是一个'.so',而不是'.dll',虽然不应该有所作为... – TC1 2012-02-08 10:02:24
你说得对,我的意思是先写“Shared lib”,但是写了DLL,因为我想展示目前它是这种特定类型的共享库的问题。 – MOnsDaR 2012-02-08 10:16:31