将类的序列化放入DLL中

我正在寻找一个(工作)示例,用于在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_;
};

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

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 )

serializeBar.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是非常奇特的...


最近我遇到了一个类似的问题,在问了这个问题3年之后。 我终于找到了解决办法。 在上面的例子中。

  • BarFoo的子类,所以它必须注册/导出;
  • serializeFoo.cpp实例化一个GUID模板类来注册/导出Foo ;
  • serializeBar.cpp实例化一个GUID模板类来注册/导出Bar ;
  • 遵守在导出类密钥之前包含所有必要存档类型的规则;
  • 两个翻译单元都链接在一起以创建一个DLL。
  • 我假设在你的exe文件中,当你试图序列化指向Bar对象的Foo*指针时,你得到了“未注册的类blahblah”错误。 这是因为Boost.Serialization 调用序列化函数之前无法正确地为类Bar生成一个GUID。

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

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

    希望能帮助到你。


    与序列化库一起分发的测试套件和演示程序完全展示了这一功能。 所以首先确保这些工作。 然后比较你的例子。

    罗伯特拉米

    “诚实地说,恕我直言,在某些时候,Boost Serialization跨越了纯粹c ++构建模型而不是外部工具可靠的可能性的边界......”

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

    RR


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

    老实说,恕我直言,在某些时候,Boost Serialization跨越了纯粹的c ++构建模型(不包括外部工具)可靠的可能性的边界......

    链接地址: http://www.djcxy.com/p/10411.html

    上一篇: Put the serialization of a class into a DLL

    下一篇: Node.js integration with MS Exchange EWS