std::string を使用したクラスのシリアル化
C では、オブジェクトを文字配列 (char*) にキャストすることによってオブジェクトをシリアル化することがよくあります。 ) そしてそれをファイルに書き込みます。このアプローチは、整数などの単純なデータ型にはうまく機能しますが、std::string のような動的データ構造を扱う場合に問題が発生します。
シリアル化されたオブジェクトが逆シリアル化されると、その中に含まれる std::string がポイントする可能性があります。メモリが存在しなくなり、「アドレス範囲外」エラーが発生します。
この問題に対処するための標準的な回避策は、カスタムのシリアル化および逆シリアル化メソッドを実装することです。クラス自体の中で。これらのメソッドは、std::string のサイズと文字を手動でシリアル化および逆シリアル化できます。
実装:
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; } };
使用法:
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();
このカスタム アプローチにより、 std::string は正しくシリアル化および逆シリアル化されます。さらに、ストリーム演算子 (<< および >>) を使用してオブジェクトをシリアル化および逆シリアル化する便利な方法も提供します。
以上がstd::string を含む C クラスを安全にシリアル化および逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。