ホームページ >バックエンド開発 >C++ >std::string メンバーを使用して C クラスを適切にシリアル化するにはどうすればよいですか?

std::string メンバーを使用して C クラスを適切にシリアル化するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-03 14:00:20805ブラウズ

How to Properly Serialize a C   Class with a std::string Member?

std::string メンバーを使用したクラスのシリアル化

std::string を含むクラスをシリアル化するときに、「 std::string はヒープに割り当てられたメモリを指す動的データ構造であるため、アドレス範囲外です」というエラーが発生します。クラスを char* にキャストしてファイルに書き込むと、実際の内容ではなく、文字列のメモリ アドレスのみがキャプチャされます。

この問題を解決するには、次のアプローチを検討してください。

  1. カスタム シリアル化関数および逆シリアル化関数:

    void の実装クラス内の MyClass::serialize(std::ostream) および void MyClass::deserialize(std::istream) メンバー関数。これらの関数は、std::string を含むすべてのメンバー変数のシリアル化と逆シリアル化を処理します。

  2. シリアル化ロジック:

    In )、std::string のサイズをストリームに書き込み、その後にその文字を書き込みます。これにより、文字列データがクラス オブジェクトとは別にシリアル化されることが保証されます。

  3. 逆シリアル化ロジック:

    deserialize() で、文字列のサイズを読み取ります。ストリームから、その文字が続きます。この情報を使用して、std::string オブジェクトを再構築します。

そのような関数の例を次に示します。

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;
}
  1. Stream演算子のオーバーロード:

    便利に使用するために、オーバーロードすることもできます。クラスのストリーム演算子:

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::strings を含むクラスを効率的かつ確実にシリアル化および逆シリアル化できます。

以上がstd::string メンバーを使用して C クラスを適切にシリアル化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。