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

Comment sérialiser une classe C contenant un std :: string ?

DDD
DDDoriginal
2024-12-08 18:57:13604parcourir

How to Serialize a C   Class Containing an std::string?

Sérialiser une classe avec un std::string

Sérialiser une classe qui contient un std::string présente des défis en raison du pointeur de la chaîne -nature basée. La technique standard consistant à convertir la classe en char* et à l'écrire dans un fichier ne fonctionnera pas, comme c'est le cas pour les types de données primitifs.

Fonctions de sérialisation personnalisées

Une solution de contournement standard consiste à créer des fonctions de sérialisation et de désérialisation personnalisées pour la classe. Ces fonctions gèrent la lecture et l'écriture des données de classe de manière contrôlée.

Exemples de fonctions

Pour une classe contenant un std::string nommé "name", les fonctions de sérialisation et de désérialisation pourraient être implémentées comme suit :

std::ostream& MyClass::serialize(std::ostream& out) const {
    out << height;
    out << ',' // number separator
    out << width;
    out << ',' // number separator
    out << name.size(); // serialize size of string
    out << ',' // number separator
    out << name; // serialize characters of string
    return out;
}

std::istream&amp; MyClass::deserialize(std::istream&amp; in) {
    if (in) {
        int len = 0;
        char comma;
        in >> height;
        in >> comma; // read in the separator
        in >> width;
        in >> comma; // read in the separator
        in >> len; // deserialize size of string
        in >> comma; // read in the separator
        if (in &amp;&amp; len) {
            std::vector<char> tmp(len);
            in.read(tmp.data(), len); // deserialize characters of string
            name.assign(tmp.data(), len);
        }
    }
    return in;
}

Surcharge du flux Opérateurs

Pour une utilisation plus facile, vous pouvez surcharger les opérateurs de flux de votre classe :

std::ostream &amp;operator<<(std::ostream&amp; out, const MyClass &amp;obj) {
    obj.serialize(out);
    return out;
}

std::istream &amp;operator>>(std::istream&amp; in, MyClass &amp;obj) {
    obj.deserialize(in);
    return in;
}

Avec ces fonctions et surcharges, vous pouvez désormais sérialiser et désérialiser une classe contenant un std ::string en utilisant simplement les opérateurs de flux.

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