ホームページ > バックエンド開発 > C++ > std::string を含む C クラスを安全にシリアル化および逆シリアル化する方法

std::string を含む C クラスを安全にシリアル化および逆シリアル化する方法

Linda Hamilton
リリース: 2024-12-05 12:33:14
オリジナル
918 人が閲覧しました

How to Safely Serialize and Deserialize a C   Class Containing an std::string?

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 サイトの他の関連記事を参照してください。

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