7

我正在寻找一个(工作)示例,用于外部序列化 DLL 中的类结构。目前我找不到任何例子。Boost 文档只是说明了一些宏,论坛和新闻组只是在讨论其解决方案的具体问题。

所以我要求一个(外部)序列化类结构的示例,如下所示。除了类代码,我还添加了一些用于序列化的代码(这不起作用,请参阅底部的错误消息)。

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_;
};

到目前为止,我所拥有的都是这样的代码:

序列化Foo.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_

序列化Foo.cpp

#include "serializeFoo.h"
BOOST_CLASS_EXPORT_IMPLEMENT( Foo )

序列化吧.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_

序列化吧.cpp

#include "serializeBar.h"
BOOST_CLASS_EXPORT_IMPLEMENT( Bar )

序列化代码进入 DLL 并应在另一个使用类 Foo 和 Bar 的项目中使用。一切编译正常,但在运行时我收到消息
unregistered class - derived class not registered or exported

那么我是否使用了错误的宏?我错过了一个宏吗?上面的代码是正确的还是存在某种结构错误?也许这对很多其他人也很有用,我不认为将类的序列化放入 DLL 是非常奇特的......

4

4 回答 4

2

在提出这个问题三年后,我最近遇到了类似的问题。我终于找到了解决方法。在上面的例子中。

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

我假设在您的 exe 中,当您尝试序列化Foo*指向Bar对象的指针时,您收到“未注册的类 blahblah”错误。这是因为 Boost.Serialization 在调用 serialize 函数Bar 之前不知何故没有为类正确生成 GUID 。

我不知道为什么会发生这种情况,但似乎 GUID 是以一种懒惰的方式生成的——如果没有使用翻译单元中的任何符号,则serializeBar.cpp不会执行该翻译单元中定义的任何实例化/初始化代码—— - 包括 . 的类注册/导出Bar

为了证明这一点,您可以在serializeBar.cpp调用. 问题应该消失。serializeBar.cppFoo*

希望能帮助到你。

于 2015-03-12T14:20:42.383 回答
1

与序列化库一起分发的测试套件和演示正是展示了这一功能。所以首先确保它有效。然后将您的示例与它进行比较。

罗伯特·拉米

“老实说,恕我直言,在某些时候,Boost 序列化跨越了纯 c++ 构建模型(不带外部工具)可靠地可能实现的边界......”

hmmmmmm - 所以它尽可能地越过边界?不过,你在精神上是非常正确的。付出了巨大的努力来实现所有被认为是使这种软件包可以被接受为 boost 所必需的一切。

RR

于 2012-07-07T01:44:01.867 回答
0

用于BOOST_CLASS_EXPORT注册您想要序列化的所有类

于 2012-12-17T09:42:56.977 回答
0

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

老实说,恕我直言,在某些方面,Boost 序列化跨越了纯 c++ 构建模型(不带外部工具)可靠地可能实现的边界......

于 2012-02-15T07:20:02.900 回答