Sérialiser une classe qui contient une chaîne std :: string
Je ne suis pas un c++ expert, mais j'ai sérialisé choses une couple de fois dans le passé. Malheureusement, cette fois, je suis en train de sérialiser une classe qui contient une std::string, je crois comprendre que c'est un peu comme de la sérialisation d'un pointeur.
Je peux écrire la classe dans un fichier et de le lire à nouveau. Tous les int les champs sont bien, mais le std::string champ donne une adresse en dehors des limites d'erreur", sans doute parce que les points de données qui n'est plus là.
Est-il un standard solution pour cela? Je ne veux pas revenir à des tableaux de char, mais au moins je sais qu'ils travaillent dans cette situation. Je peux fournir le code si nécessaire, mais j'espère que j'ai expliqué mon problème.
Je suis la sérialisation par la coulée de la classe à un char* et l'écrire dans un fichier avec fstream. La lecture est évidemment tout l'inverse.
source d'informationauteur iwasinnamuknow
Vous devez vous connecter pour publier un commentaire.
Malheureusement, cela ne fonctionne que tant qu'il n'y a pas des pointeurs. Vous pourriez vouloir donner à vos classes
void MyClass::serialize(std::ostream)
etvoid MyClass::deserialize(std::ifstream)
et appelez-les. Dans ce cas, vous voulezVous pouvez aussi surcharger le flux des opérateurs pour une utilisation plus facile.
Simplement d'écrire le contenu binaire d'un objet dans un fichier n'est pas seulement portables mais, comme vous l'avez reconnu, ne fonctionne pas pour le pointeur de données. En gros, vous avez deux options: soit vous écrivez une véritable bibliothèque de sérialisation, qui gère std::les chaînes de caractères correctement en utilisant, par exemple c_str() à la sortie de la chaîne réelle du fichier, ou vous utilisez l'excellent stimuler la sérialisation de la bibliothèque. Si possible, je vous recommande le dernier, vous pouvez sérialiser avec un simple code comme ceci:
Ici, la fonction
serialize
travaux pour la sérialisation et la désérialisation des données, en fonction de comment vous l'appelez. Voir la documentation pour plus d'informations.La meilleure méthode de sérialisation pour les chaînes ou d'autres gouttes avec la variable de la taille est de sérialiser d'abord la taille que vous sérialiser des entiers, alors il suffit de copier le contenu dans le flux de sortie.
Lors de la lecture de lire d'abord la taille, puis allouer de la chaîne, puis remplir par lire le nombre d'octets dans le flux.
Une alternative est d'utiliser un séparateur et d'évasion, mais nécessite plus de code et est plus lente à la fois sur la sérialisation et la désérialisation (cependant, le résultat peut être gardé lisible par l'homme).
Vous aurez à utiliser un plus compliqué méthode de sérialisation de la coulée d'une classe à un
char*
et écrire dans un fichier si votre classe contient toutes les données exogènes (string
n'). Et vous avez raison au sujet de pourquoi vous obtenez une erreur de segmentation.Je voudrais faire une fonction membre qui serait prendre un
fstream
et lire les données à partir d'une fonction inverse qui serait de prendre unfstream
et écrire du contenu pour qu'il soit restauré plus tard, comme ceci:Vous pouvez également définir
operator<<
etoperator>>
de travailler avecistream
etostream
pour sérialiser et de restauration de votre classe ainsi si vous voulez que le sucre syntaxique.Pourquoi ne pas simplement quelque chose le long des lignes de:
et puis:
Je n'ai pas codé en C++ dans un temps long, mais vous pourriez peut-être sérialiser un tableau de
char
.Ensuite, lorsque vous ouvrez votre fichier, votre
string
voudrais juste pointer vers le tableau.Juste une idée.