Estoy buscando un ejemplo (de trabajo) para serializar externamente una estructura de clases en una DLL. Actualmente no puedo encontrar ningún ejemplo para eso. La documentación de Boost solo está indicando algunas macros, los foros y grupos de noticias solo están discutiendo problemas específicos con sus soluciones.Poner la serialización de una clase en una DLL
Así que estoy pidiendo un ejemplo para serializar (externamente) una estructura de clases como la siguiente. Junto con el código de clase, agregué un código mío para la serialización (que no funciona, ver el mensaje de error en la parte inferior).
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_;
};
Todo lo que tengo hasta ahora es un código como éste:
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)
El código de serialización entra en un DLL y se debe utilizar en otro proyecto con clases de Foo y Bar. Todo compila bien, pero en tiempo de ejecución aparece el mensaje
unregistered class - derived class not registered or exported
también lo hizo que utiliza las macros equivocadas? ¿Extraño una macro? ¿Es correcto el código anterior o hay algún tipo de error estructural? Quizás esto podría ser útil para muchas otras personas, no creo que poner la serialización de una clase en una DLL sea muy exótico ...
Lo que vi en Boost-docs fue 'BOOST_SERIALIZATION_FACTORY_0 (Foo)', pero no sé si es necesario y si debería usarlo. Enlace: http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/special.html#dlls – MOnsDaR
Bueno, si te hace sentir mejor, tengo un proyecto en el que funciona bien , y el código se ve bastante idéntico a lo que tiene, excepto por el hecho de que incluyo los encabezados de archivo en la parte superior del archivo de encabezado. PD es técnicamente un '.so', no un' .dll', no debería marcar la diferencia ... – TC1
Tienes razón, quise escribir "Shared lib" al principio, pero escribí DLL porque quería mostrar que actualmente es un problema con este tipo específico de lib compartido. – MOnsDaR