首頁 > 後端開發 > C++ > 如何使用 std::string 成員正確序列化 C 類別?

如何使用 std::string 成員正確序列化 C 類別?

Susan Sarandon
發布: 2024-12-03 14:00:20
原創
800 人瀏覽過

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. 序列化邏輯:

    在serialize( ),將 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板