2012-10-03 12 views
6

Ho un problema in un'applicazione che sto facendo. Ho bisogno di serializzare alcuni pacchetti usando la serializzazione boost. Secondo la documentazione, è possibile utilizzare rispettivamente BOOST_CLASS_EXPORT_KEY e BOOST_CLASS_EXPORT_IMPLEMENT in file .hpp e .cpp per poter utilizzare il puntatore di base polimorfico per serializzare la classe derivata.boost serialization e register_type

Così qui è quello che ho:

.hpp: containaing la mia dichiarazione di classe e finalmente la cpp BOOST_CLASS_EXPORT_KEY(mynamespace::mypacket)

: contenente la mia definizione di classe e il Tutto BOOST_CLASS_EXPORT_IMPLEMENT(mynamespace::mypacket)

funziona bene fino a questo punto ma quando ho bisogno di serializzare ottengo un errore bad_alloc.

Ho lavorato a questo problema chiamando esplicitamente il metodo register_type<mypacket>() sull'archivio che ho bisogno di usare.

Ma ecco la mia domanda: l'EXPORT * di boost significava evitare le chiamate al metodo register_type o sto facendo qualcosa di sbagliato? Mi sento come se facessi due volte lo stesso lavoro nel mio codice, ma più di quello non vedo alcun vantaggio di usare la chiave di esportazione + implementare se dobbiamo ancora usare register_type in archivio dopo!

Ho letto altri post qui e altrove, sembra che non sia l'unico a sperimentare il problema, ma non ho ancora trovato alcuna risposta.

risposta

8

ho capito come evitare di chiamare register_type in archivio. Per coloro che potrebbero essere interessati, è necessario eseguire la specializzazione per la serializzazione dei modelli e l'esportazione di chiavi + strumenti.

: ecco che cosa il vostro .hpp dovrebbe essere simile:

  • dichiarazione di classe (MyNamespace :: myclass)
  • classe esportazione: BOOST_CLASS_EXPORT_KEY(mynamespace::myclass)

E nel cpp:

  • class definiton
  • Classe di esportazione: BOOST_CLASS_EXPORT_IMPLEMENT(mynamespace::myclass)
  • E: serialize() specializzazione membro sull'archivio è necessario utilizzare, per ogni classe:

template void mynamespace::mypacket::serialize(boost::archive::text_iarchive& arch, const unsigned int version);

template void mynamespace::mypacket::serialize(boost::archive::text_oarchive& arch, const unsigned int version);

Dove boost :: :: archivio L'archivio di testo (i/o) dovrebbe essere sostituito con qualunque tipo di archivio di boost che si sta utilizzando.

nella speranza che possa aiutare qualcuno un giorno (questo è chiaramente scritto nella boost documentation, ma devo aver perso fino ad oggi ...)

+0

Grazie !!! Ti darei +10 se potessi, mi hai salvato la vita! È un giorno intero che stavo avendo alcune classi il cui 'boost :: serialization :: extended_type_info :: get_key()' ha restituito NULL. Solo alcuni per le classi, in altri funzionava perfettamente e restituiva il nome stringificato correttamente. E questa era la ragione! Non ho diviso il processo "EXPORT" in due fasi!Stavo usando 'BOOST_CLASS_EXPORT (CLASS)' nei miei file '.cpp', al posto di' BOOST_CLASS_EXPORT_KEY (CLASS) 'nel' .h'and 'BOOST_CLASS_EXPORT_IMPLEMENT (CLASS)' nel '.cpp'. ** GRAZIE ANCORA !!! ** :) – Avio

+0

Ricevo 'riferimento non definito a void myclass :: serialize (...)' se faccio la stessa cosa con te e il documento. – Shibli