Sto cercando un esempio (funzionante) per serializzare esternamente una struttura di classe in una DLL. Al momento non riesco a trovare alcun esempio per questo. La documentazione di Boost sta solo indicando alcune macro, i forum e i newsgroup stanno semplicemente discutendo problemi specifici con le loro soluzioni.Inserire la serializzazione di una classe in una DLL
Quindi sto chiedendo un esempio per serializzare (esternamente) una struttura di classe come la seguente. Insieme al codice di classe ho aggiunto un mio codice per la serializzazione (che non funziona, vedi in basso per il messaggio di errore).
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_;
};
Tutto quello che ho finora è il codice come questo:
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)
La serializzazione codice va in una DLL e dovrebbe essere utilizzato in un altro progetto utilizzando le classi Foo e Bar. Tutto si compila bene, ma in fase di esecuzione ricevo il messaggio
unregistered class - derived class not registered or exported
Così ho usato i macro sbagliati? Mi manca una macro? Il codice sopra è corretto o c'è qualche tipo di errore strutturale? Forse questo potrebbe essere utile anche per molte altre persone, non penso che mettere la serializzazione di una classe in una DLL sia molto esotico ...
Su cosa ho visto su Boost-docs era 'BOOST_SERIALIZATION_FACTORY_0 (Foo)', ma non so se è necessario e se dovrei usarlo. Link: http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/special.html#dlls – MOnsDaR
Beh, se ti fa sentire meglio, ho un progetto in cui funziona bene e il codice sembra piuttosto identico a quello che hai, tranne per il fatto che includo le intestazioni di archivio nella parte superiore del file di intestazione. Post scriptum è tecnicamente un '.so', non un' .dll', non dovrebbe fare la differenza però ... – TC1
Hai ragione, volevo scrivere "Shared lib" all'inizio, ma ho scritto DLL perché volevo mostrare che attualmente è un problema con questo specifico tipo di lib condivisa. – MOnsDaR