Heim >Backend-Entwicklung >C++ >Wie kann ich eine C-Klasse, die einen std::string enthält, sicher serialisieren und deserialisieren?

Wie kann ich eine C-Klasse, die einen std::string enthält, sicher serialisieren und deserialisieren?

Linda Hamilton
Linda HamiltonOriginal
2024-12-05 12:33:14936Durchsuche

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

Serialisieren einer Klasse mit einem std::string

In C beinhaltet das Serialisieren von Objekten häufig die Umwandlung des Objekts in ein Zeichenarray (char* ) und in eine Datei schreiben. Dieser Ansatz funktioniert gut für einfache Datentypen wie Ganzzahlen, es treten jedoch Probleme beim Umgang mit dynamischen Datenstrukturen wie std::string auf.

Wenn das serialisierte Objekt deserialisiert wird, kann der darin enthaltene std::string auf verweisen Speicher, der nicht mehr vorhanden ist, was zu einem Fehler „Adresse außerhalb der Grenzen“ führt.

Um dieses Problem zu beheben, besteht eine Standardlösung darin, benutzerdefinierte Serialisierungs- und Deserialisierungsmethoden innerhalb der Klasse zu implementieren sich selbst. Diese Methoden können die Größe und Zeichen des std::string manuell serialisieren und deserialisieren.

Implementierung:

class MyClass {
    int height;
    int width;
    std::string name;

public:
    std::ostream& operator<<(std::ostream& out) const {
        out << height << ',' << width << ',' << name.size() << ',' << name;
        return out;
    }
    std::istream& operator>>(std::istream& in) {
        int len = 0;
        char comma;
        in >> height >> comma >> width >> comma >> len >> comma;
        if (len) {
            std::vector<char> tmp(len);
            in.read(tmp.data(), len);
            name.assign(tmp.data(), len);
        }
        return in;
    }
};

Verwendung:

MyClass obj;
obj.height = 10;
obj.width = 15;
obj.name = "MyClass";

// Serialize to file
std::ofstream outfile("myclass.dat");
outfile << obj;
outfile.close();

// Deserialize from file
std::ifstream infile("myclass.dat");
infile >> obj;
infile.close();

Dieser benutzerdefinierte Ansatz stellt sicher, dass der std::string korrekt serialisiert und deserialisiert wird. Darüber hinaus bietet es eine praktische Möglichkeit, Objekte mithilfe der Stream-Operatoren (<< und >>) zu serialisieren und zu deserialisieren.

Das obige ist der detaillierte Inhalt vonWie kann ich eine C-Klasse, die einen std::string enthält, sicher serialisieren und deserialisieren?. 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