Heim >Backend-Entwicklung >C++ >Wie serialisiere ich eine C-Klasse ordnungsgemäß mit einem 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:
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.
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.
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; }
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!