首頁 >後端開發 >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的類別:: 只需使用流運算子即可字串。

以上是如何序列化包含 std::string 的 C 類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn