Я ищу (рабочий) пример для внешней сериализации структуры классов в 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 очень экзотично ...