Maison > développement back-end > C++ > Comment sérialiser correctement une classe C avec un membre std :: string ?

Comment sérialiser correctement une classe C avec un membre std :: string ?

Susan Sarandon
Libérer: 2024-12-03 14:00:20
original
894 Les gens l'ont consulté

How to Properly Serialize a C   Class with a std::string Member?

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 :

  1. 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.

  2. 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.

  3. 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;
}
Copier après la connexion
  1. 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;
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal