使用std::string 成員序列化一個類別
當序列化包含std::string 的類別時,您可能會遇到「位址越界」錯誤,因為std::string 是指向堆分配記憶體的動態資料結構。將類別轉換為 char* 並將其寫入檔案只會捕獲字串的記憶體位址,而不是其實際內容。
要解決此問題,請考慮以下方法:
自訂序列化和反序列化函數:
實作void類別中的MyClass::serialize(std::ostream) 和void MyClass::deserialize(std::istream)成員函數。這些函數將處理所有成員變數的序列化和反序列化,包括std::string。
序列化邏輯:
在serialize( ),將 std::string 的大小寫入流,後面接著其字元。這確保字串資料與類別物件分開序列化。
反序列化邏輯:
在 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; }
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中文網其他相關文章!