Heim >Backend-Entwicklung >C++ >Wie serialisiere ich eine C-Klasse ordnungsgemäß mit einem std::string-Member?

Wie serialisiere ich eine C-Klasse ordnungsgemäß mit einem std::string-Member?

Susan Sarandon
Susan SarandonOriginal
2024-12-03 14:00:20805Durchsuche

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

Serialisieren einer Klasse mit einem std::string-Member

Beim Serialisieren einer Klasse, die einen std::string enthält, kann es zu einem „ Adresse außerhalb der Grenzen“-Fehler, da std::string eine dynamische Datenstruktur ist, die auf Heap-zugewiesenen Speicher verweist. Durch das Umwandeln der Klasse in ein char* und das Schreiben in eine Datei wird nur die Speicheradresse der Zeichenfolge erfasst, nicht ihr tatsächlicher Inhalt.

Um dieses Problem zu beheben, ziehen Sie den folgenden Ansatz in Betracht:

  1. Benutzerdefinierte Serialisierungs- und Deserialisierungsfunktionen:

    Implementieren Sie void MyClass::serialize(std::ostream) und void MyClass::deserialize(std::istream) Memberfunktionen in Ihrer Klasse. Diese Funktionen übernehmen die Serialisierung und Deserialisierung aller Mitgliedsvariablen, einschließlich std::string.

  2. Serialisierungslogik:

    In serialize( ), schreiben Sie die Größe des std::string in den Stream, gefolgt von seinen Zeichen. Dadurch wird sichergestellt, dass die String-Daten getrennt vom Klassenobjekt serialisiert werden.

  3. Deserialisierungslogik:

    Lesen Sie in deserialize() die Größe des Strings aus dem Stream, gefolgt von seinen Charakteren. Verwenden Sie diese Informationen, um das std::string-Objekt zu rekonstruieren.

Hier ist ein Beispiel für solche Funktionen:

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 Operator-Überladung:

    Für eine bequemere Nutzung können Sie auch die Stream-Operatoren für Sie überladen Klasse:

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

Durch die Implementierung benutzerdefinierter Serialisierungs- und Deserialisierungsfunktionen können Sie Klassen, die std::strings enthalten, effizient und zuverlässig serialisieren und deserialisieren.

Das obige ist der detaillierte Inhalt vonWie serialisiere ich eine C-Klasse ordnungsgemäß mit einem std::string-Member?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn