2012-02-08 17 views
6

我正在寻找一个(工作)的例子,用于在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是非常奇特的...

+0

我在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

+0

好吧,如果它让你感觉更好,我有一个项目,它工作得很好,并且代码看起来与您所拥有的完全相同,除了我将归档头文件包含在头文件顶部之外。附:它在技术上是一个'.so',而不是'.dll',虽然不应该有所作为... – TC1 2012-02-08 10:02:24

+0

你说得对,我的意思是先写“Shared lib”,但是写了DLL,因为我想展示目前它是这种特定类型的共享库的问题。 – MOnsDaR 2012-02-08 10:16:31

回答

1

我碰到了类似的问题,最近注册,3年后,这一问题被提出。我终于找到了解决办法。在上面的例子中。

  • BarFoo的子类,所以必须注册/导出;
  • serializeFoo.cpp实例化一个GUID模板类来注册/导出Foo;
  • serializeBar.cpp实例化一个GUID模板类来注册/导出Bar;
  • 遵守在导出类关键字之前包含所有必需存档类型的规则;
  • 两个翻译单元都链接在一起创建一个DLL。

我承担你的exe文件,而你试图连载一Foo*指针指向Bar对象,你得到了“未注册类blahblah”的错误。这是因为Boost.Serialization在某种程度上不能正确生成类Bar的GUID,因为在之前调用了序列化函数。

我不知道为什么会发生这种情况,但看起来GUID是以一种懒惰的方式生成的 - 如果没有使用翻译单元serializeBar.cpp的符号,那么在该翻译中定义的实例/初始化代码都不会单位将被执行 - 包括Bar的班级注册/出口。

为了证明这一点,您可以在调用Foo*的任何序列化函数之前尝试使用serializeBar.cpp中的(虚拟)符号(例如,通过调用serializeBar.cpp中实现的虚拟函数)。这个问题应该消失。

希望它有帮助。

+0

3年...该死! :d – MOnsDaR 2015-03-13 16:40:33

0

很难说......事情有很多机会出错了。我建议下载boost序列化的测试代码(www.boost.org/doc/libs/1_48_0/libs/serialization/test/)。看一下Ah,A.cpp和dll_a.cpp(基本上测试你的场景)的测试用例,并试着让它在boost测试系统之外工作:使用你的编译环境,尝试修改编译器/链接器选项以与您的工具集的增强测试套件相匹配。

老实说,恕我直言,在某些点上,升压序列化跨越的什么是纯C可靠可能++建立模型W/O外部工具边境...

1

测试套件和演示与序列库分布演示正是这个设施。所以首先确保这些工作。然后比较你的例子。

罗伯特·雷米

“老实说,恕我直言,在某些点上,升压序列化跨越的什么是纯C可靠可能++建立模型W/O外部工具边境......”

hmmmmmm - 所以它可能会跨越边界?尽管你的精神非常正确。花了很大的努力来实施一切被认为是必要的,这样的一揽子计划才能被接受。

RR

0

使用BOOST_CLASS_EXPORT到所有的类,你想序列化