std::string を使用したクラスのシリアル化
std::string を含むクラスのシリアル化には、文字列のポインターによる問題が発生します-ベースの性質。クラスを char* にキャストしてファイルに書き込むという標準的な手法は、プリミティブ データ型の場合とは異なり、機能しません。
カスタム シリアル化関数
標準的な回避策には、クラスのカスタムのシリアル化関数と逆シリアル化関数を作成することが含まれます。これらの関数は、制御された方法でクラス データの読み取りと書き込みを処理します。
関数の例
「name」という名前の std::string を含むクラスの場合、シリアル化および逆シリアル化関数は次のように実装できます:
std::ostream& MyClass::serialize(std::ostream& out) const { out << height; out << ',' // number separator out << width; out << ',' // number separator out << name.size(); // serialize size of string out << ',' // number separator out << name; // serialize characters of string return out; } std::istream& MyClass::deserialize(std::istream& in) { if (in) { int len = 0; char comma; in >> height; in >> comma; // read in the separator in >> width; in >> comma; // read in the separator in >> len; // deserialize size of string in >> comma; // read in the separator if (in && len) { std::vector<char> tmp(len); in.read(tmp.data(), len); // deserialize characters of string 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 はストリーム演算子を使用するだけです。
以上がstd::string を含む C クラスをシリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。