首頁 > 後端開發 > C++ > 如何安全地序列化和反序列化包含 std::string 的 C 類別?

如何安全地序列化和反序列化包含 std::string 的 C 類別?

Linda Hamilton
發布: 2024-12-05 12:33:14
原創
933 人瀏覽過

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();
登入後複製

此自訂方法可確保stddstring正確序列化並反序列化。此外,它還提供了一種使用流運算子(>)來序列化和反序列化物件的便捷方法。

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

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