std::string を含むクラスのシリアル化: ポインタのジレンマを理解する
シリアル化は、オブジェクトの状態を保存するために使用される重要な手法です保管または転送用。ただし、std::strings を含むクラスのシリアル化には、std::strings のポインタの性質により課題が生じます。
この問題は、std::string を含むクラスを char にキャストしてシリアル化しようとすると発生します。 * そしてそれをファイルに書き込みます。このアプローチは単純なデータ型では機能しますが、ポインターの依存関係が考慮されていないため、std::strings では失敗します。
ポインターのシリアル化の標準的な回避策
解決するにはこの問題の標準的な回避策には、クラスにシリアル化メソッドと逆シリアル化メソッドを導入することが含まれます。これらのメソッドは、ポインタを含むオブジェクトの内部データの書き込みと読み取りを手動で処理します。
実装例は次のようになります。
// Serialization method std::ostream& MyClass::serialize(std::ostream &out) const { // Serialize numeric values using the output stream out << height; out << ',' // Separator out << width; out << ',' // Separator // Serialize the std::string out << name.size(); // String length out << ',' // Separator out << name; // String characters return out; } // Deserialization method std::istream& MyClass::deserialize(std::istream &in) { if (in) { // Deserialize numeric values using the input stream int len=0; char comma; in >> height; in >> comma; // Separator in >> width; in >> comma; // Separator // Deserialize the std::string in >> len; // String length in >> comma; // Separator if (in && len) { std::vector<char> tmp(len); in.read(tmp.data() , len); // String characters name.assign(tmp.data(), len); } } return in; }
ストリーム演算子をオーバーロードすると、これらの演算子の使用を簡素化できます。メソッド:
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;}
これらの手法を使用すると、std::string を効果的にシリアル化および逆シリアル化できます。整合性とポインタの依存関係を維持した、より大きなクラス。
以上がC で std::string を含むクラスを適切にシリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。