J'essaie de sérialiser un pointeur à une classe polymorphe Permettez-moi d'afficher un boîtier de test minimal: P> main.cpp strong> p> ici, Voici donc le problème: où Utilisez Si cela importe, j'utilise g ++ 4.4.3 et boost 1.40. P> P> forme code>. Donc, j'ai besoin d'utiliser
boost_class_export code > Macro
pour définir un GUIG pour chaque sous-classe. Le problème: Où le mettre? exportation.cpp code> peut sembler un peu idiot. Dans ma situation actuelle, il contient une classe de joint qui utilise l'idiome PIMPL et essaie de sérialiser sa forme (polymorphe)
de la mise en œuvre code>. Le point important est: le
boost_class_export code> pourrait être dans un fichier d'objet différent em> que le code qui appelle la sérialisation. P>
boost_class_export code>? J'ai trois options, qui peuvent être activées à l'aide de
export_in_xxx code> macros. P>
export_in_main code> fonctionne, mais n'est pas ce que je veux. Le code invoquant la sérialisation ne doit pas avoir besoin de savoir sur les détails de la mise en œuvre de la classe PIMPL. P> li>
exporter_in_object code> compile, mais ne fonctionne pas: il se traduit par: il se traduit par un
boost :: archive :: archive_exception code> avec le message
non enregistré de vide / code>. Selon le Documentation , cela devrait Soyez résolu par des classes de base sérialisées en utilisant
boost :: sérialisement :: base_object code>, comme je l'ai fait, mais cela n'aide pas. P> Li>
export_in_header code> ne compile même pas. Le macro
boost_class_export code> se développe à une spécialisation de modèle (que nous aimerions être dans le fichier d'en-tête), mais aussi au définitiof d'un membre statique. Donc, j'ai une erreur de liaison sur un
Définition multiple de 'boost :: archive :: détail :: init_guid
6 Réponses :
Découvrez ce fil plus ancien. P>
http://lists.boost.org/boost-utilisateurs /2005/01/9390.php p>
J'ai fini par mettre tout le code de sérialisation dans un en-tête Ceci ne fonctionne que tant que la seule unité de compilation comprend s11n.h code> inclus dans le fichier CPP qui invoque la sérialisation. Essentiellement, le scénario
export_in_main code> i esquisse ci-dessus, mais avec les invocations de macro boost_class_export code> dans un fichier différent. P>
S11N.H code>, bien sûr, bien que cela fonctionne pour l'instant, ce n'est pas une solution réelle ... P>
Hélas, cela n'a pas fonctionné pour moi - ce que j'ai fini de faire était d'utiliser archive :: register_type (static_cast
@Bguiz: Eh bien, ce serait un argument contre i> l'utilisation de l'abréviation, je suppose ...;) Mais je suis le seul à maintenir ce code, donc ce n'est pas un problème pour moi. Économise des charges de taper.
Vous pouvez utiliser EXPORT_IN_OBJECT mais le fichier qui contient BOOST_CLASS_EXPORT doit également inclure tous les fichiers de l'archive HPP ce plan d'utilisation. P>
Ceci est parce que les registres macro BOOST_CLASS_EXPORT les informations de type dérivé qui archive chacun qu'il pense que vous utiliserez (implicitement déterminé sur la base desquels les archives que vous avez inclus.) P>
Dans votre exemple, utilisez EXPORT_IN_OBJECT mais aussi ajouter #include à export.cpp. p>
Dans notre code, nous avons créé archives.hpp qui contient les archives que nous utilisons et l'inclurons où que nous devons utiliser BOOST_CLASS_EXPORT. (De cette façon, nous avons une liste officielle unique des archives.) P>
L'inconvénient est que nous devons tout reconstruire quand nous décidons d'utiliser un nouveau type d'archives, mais nous avons constaté que beaucoup plus facile à utiliser que le support d'archives polymorphes. P>
Exportation classe sérialisation de les Boost.Serialization docs (1.44.0) stipule ce qui suit:
BOOST_CLASS_EXPORT code> dans le même module de source qui comprend l'un des les en-têtes de classe archive instancier Code [...] p>
Notez que le implemenation de cette Cette fonctionnalité nécessite que la
BOOST_CLASS_EXPORT code> macro apparaît après et l'inclusion de toutes les archives les en-têtes de classe pour lesquels le code doit être instancié. Ainsi, le code qui utilise
BOOST_CLASS_EXPORT code> ressemblera ce qui suit: p> Blockquote>
#include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_oarchive.hpp> ... // other archives #include "a.hpp" // header declaration for class a BOOST_CLASS_EXPORT(a) ... // other class headers and exports
J'ai mis le boost_class_export_key dans mon en-tête et le boost_class_export_implement dans mon fichier de mise en œuvre. Je construis une bibliothèque de ceux-ci, puis lorsque j'essaie de sérialiser l'objet dans un exécutable qui relie la bibliothèque, le sérieliseur ne connaît pas le type. Voir cet exemple: chat.stackoverflow.com/transcript/message/28926778#28926778#28926778
@Daviddoria - Désolé, je ne peux pas vous aider là-bas. Longtemps depuis quoi faire quelque chose avec Boost.ser
Vous pouvez utiliser et unique boost_class_export_guid () pour chaque .CPP et ajoutez-le seulement dans le fichier .cpp. pas le .h p>
Ce problème m'a conduit insensé jusqu'à ce que je me rendais compte que ma classe de base n'était pas polymorphe. En d'autres termes, il n'a jamais utilisé le mot-clé "virtuel" n'importe où. Parce que je n'avais pas besoin de comportement polymorphe.
Voici comment je l'ai réparé: p>
Dans mon fichier .CPP de classe dérivé, j'ai ajouté ce qui suit: p>
C'est tout ce que je devais faire. P> p>
Avez-vous résolu ce problème? J'ai rencontré ce problème moi-même, soit obtenir une exception de classe non enregistrée au moment de l'exécution, soit
boost :: archive :: détail :: init_guid :: guid_initializ er code> erreurs au moment de la compilation. Je suis assez soulevé, alors si vous en avez compris depuis cette question, j'apprécierais vraiment si vous partagez !! Merci!
@bguiz: pas vraiment résolu, non. Voir ma réponse ci-dessous.