Boost c ++ sérialiser un caractère *

J’ai une classe et j’essaie de sérialiser un shared_ptr mais la méthode normale de sérialiser un object ne fonctionne pas:

class Object { public: Object(); ~Object(); shared_ptrobjectone; friend class boost::serialization::access; template  void serialize(Archive &ar, const unsigned int version) { ar & objectone; } }; 

Je l’ai même essayé de cette façon mais cela ne fonctionne toujours pas:

  void serialize(Archive &ar, const unsigned int version) { for (int i = 0; i < (strlen(objectone.get())); i++) ar & objectone.get()[i]; } 

Des idées comment aborder cela? Merci.

Quelques informations supplémentaires:

J’ai déjà inclus les deux fichiers d’en-tête shared_ptr:

 #include  #include  

J’ai essayé de convertir une chaîne et de la sérialiser de cette façon, mais l’erreur suivante est générée: boost :: archive :: archive_exception ‘what (): stream error

 friend class boost::serialization::access; template  void serialize(Archive &ar, const unsigned int version) { if (objectone.get()) { ssortingng temp(objectone.get()); ar & temp; } ar & objectone; } 

Il vous manque des concepts clés. Vous n’avez plus besoin de share_ptr si vous utilisez std :: ssortingng.

Tu peux faire

 class Object { public: Object(); ~Object(); std::ssortingng name; template  void serialize(Archive &ar, const unsigned int version) { ar & name; } }; 

et vous avez terminé.

Une addition

Étant donné vos besoins, voici ce que vous devez faire

 class test { public: friend class boost::serialization::access; test() { } template void save(Archive & ar, const unsigned int version) const { int len = strlen(data.get()); ar & len; for (int index = 0; index < len; ++index) ar & data[index]; } template void load(Archive & ar, const unsigned int version) { int len = 0; ar & len; data = boost::shared_array(new char[len+1]); for (int index = 0; index < len; ++index) ar & data[index]; data[len] = 0; } BOOST_SERIALIZATION_SPLIT_MEMBER() boost::shared_array data; }; 

Il y a plus d’un problème avec votre code.

Tout d’abord, shared_ptr n’est pas destiné à contenir des tableaux. Arrêter de faire ça.

Deuxièmement, la bibliothèque de sérialisation n’enregistre pas les chaînes de style C que je connais. Ce serait assez difficile à implémenter et fondamentalement inutile puisque vous pouvez enregistrer un vector ou une ssortingng , ce que vous devriez utiliser de toute façon.

Si vous insistez vraiment pour conserver une chaîne char* vous devez le convertir en vector/ssortingng et l’enregistrer. Ensuite, lors de la lecture, vous devez lire ce vector/ssortingng , obtenir la taille, allouer la mémoire, la coller, etc. à mettre en œuvre vous-même. S’amuser.

Nouveau code édité:

Vous faites une sauvegarde dans une fonction qui couvre à la fois save et load. Bien sûr, cela ne fonctionne pas très bien pour le chargement. Vous devez diviser votre sérialisation. if (Archive::is_saving) ne fonctionnera pas non plus. La documentation de boost explique comment scinder correctement la routine de sérialisation.

Gardez à l’esprit ce que Crazy Eddie a dit à propos de shared_ptr n’étant pas le bon outil pour le poste. Puisque vous n’avez pas la possibilité de changer la définition de la classe, vous pouvez contourner ce problème.

boost :: serialization fournit un conteneur make_array qui prend un pointeur et l’enveloppe comme un tableau pour la sérialisation. Cela nécessite que la taille de la masortingce soit connue avant la sérialisation.

Vous pourriez alors faire quelque chose comme:

 void serialize(Archive &ar, const unsigned int version) { ar & array_size; // Figure out how to determine this (perhaps strlen(objectone.get()) if (ar::is_loading) { objectone.reset(new char[array_size]); // allocate the array before we load it } if (objectone.get() != NULL) { ar & make_array(objectone.get(), array_size); } } 

Cet exemple de code est assez rudimentaire, mais traduit le concept.