ホームページ > バックエンド開発 > C++ > C で std::string を含むクラスを適切にシリアル化する方法

C で std::string を含むクラスを適切にシリアル化する方法

Barbara Streisand
リリース: 2024-12-10 03:41:09
オリジナル
624 人が閲覧しました

How to Properly Serialize a Class Containing an std::string in C  ?

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&amp; MyClass::deserialize(std::istream &amp;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 &amp;&amp; len) {
            std::vector<char> tmp(len);
            in.read(tmp.data() , len); // String characters
            name.assign(tmp.data(), len);
        }
    }
    return in;
}
ログイン後にコピー

ストリーム演算子をオーバーロードすると、これらの演算子の使用を簡素化できます。メソッド:

std::ostream &amp;operator<<(std::ostream&amp; out, const MyClass &amp;obj)
{obj.serialize(out); return out;}
std::istream &amp;operator>>(std::istream&amp; in, MyClass &amp;obj)
{obj.deserialize(in); return in;}
ログイン後にコピー

これらの手法を使用すると、std::string を効果的にシリアル化および逆シリアル化できます。整合性とポインタの依存関係を維持した、より大きなクラス。

以上がC で std::string を含むクラスを適切にシリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート