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

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

DDD
DDDオリジナル
2024-12-08 18:57:13575ブラウズ

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

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&amp; MyClass::deserialize(std::istream&amp; 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 &amp;&amp; len) {
            std::vector<char> tmp(len);
            in.read(tmp.data(), len); // deserialize characters of string
            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 はストリーム演算子を使用するだけです。

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

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