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
Susan Sarandonoriginal
2024-12-03 14:00:20858parcourir

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;
}
  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;
}

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:
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