Поместите сериализацию класса в 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. Все компилируется нормально, но во время выполнения я получаю сообщение
незарегистрированный класс - производный класс не зарегистрирован или не экспортирован

Так я использовал неправильные макросы? Я пропустил макрос? Правильный ли приведенный выше код или есть какая-то структурная ошибка? Возможно, это может быть полезно и для многих других людей, я не думаю, что размещение сериализации класса в DLL - это очень экзотично ...

7
задан MOnsDaR 8 February 2012 в 09:55
поделиться