Maison >développement back-end >C++ >Comment sérialiser correctement une classe C avec un membre std :: string ?
Sérialisation d'une classe avec un membre std::string
Lors de la sérialisation d'une classe contenant un std::string, vous pouvez rencontrer un message " adresse hors limites" erreur car std::string est une structure de données dynamique qui pointe vers la mémoire allouée au tas. Convertir la classe en char* et l'écrire dans un fichier capture uniquement l'adresse mémoire de la chaîne, pas son contenu réel.
Pour résoudre ce problème, envisagez l'approche suivante :
Fonctions de sérialisation et de désérialisation personnalisées :
Implémenter void MyClass::serialize(std::ostream) et void MyClass::deserialize(std::istream) fonctions membres dans votre classe. Ces fonctions géreront la sérialisation et la désérialisation de toutes les variables membres, y compris std::string.
Logique de sérialisation :
Dans sérialiser( ), écrivez la taille de std::string dans le flux, suivie de ses caractères. Cela garantit que les données de la chaîne sont sérialisées séparément de l'objet de classe.
Logique de désérialisation :
Dans deserialize(), lisez la taille de la chaîne. du flux, suivi de ses personnages. Utilisez ces informations pour reconstruire l'objet std::string.
Voici un exemple de telles fonctions :
std::ostream& MyClass::serialize(std::ostream &out) const { out << height; out << ',' << width; out << ',' << name.size(); out << ',' << name; return out; } std::istream& MyClass::deserialize(std::istream &in) { if (in) { in >> height; in >> width; int len; in >> len; name.resize(len); in >> name; } return in; }
Stream Surcharge des opérateurs :
Pour une utilisation pratique, vous pouvez également surcharger les opérateurs de flux pour votre class:
std::ostream &operator<<(std::ostream& out, const MyClass &obj) { obj.serialize(out); return out; } std::istream &operator>>(std::istream& in, MyClass &obj) { obj.deserialize(in); return in; }
En implémentant des fonctions de sérialisation et de désérialisation personnalisées, vous pouvez sérialiser et désérialiser de manière efficace et fiable les classes contenant std::strings.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!