序列化包含std::string 的類別:理解指標困境
序列化是用於保存物件狀態的關鍵技術用於儲存或轉移。然而,由於 std::strings 的指標性質,序列化包含 std::strings 的類別會帶來挑戰。
嘗試透過將包含 std::string 的類別轉換為 char 來序列化包含 std::string 的類別時會出現此問題* 並將其寫入檔案。此方法適用於簡單資料類型,但不適用於 std::strings,因為它不考慮指標依賴性。
指標序列化的標準解決方法
要克服對於這個問題,標準的解決方法包括將序列化和反序列化方法引入到類別中。這些方法手動處理物件內部資料(包括指標)的寫入和讀取。
範例實作如下:
// Serialization method std::ostream& MyClass::serialize(std::ostream &out) const { // Serialize numeric values using the output stream out << height; out << ',' // Separator out << width; out << ',' // Separator // Serialize the std::string out << name.size(); // String length out << ',' // Separator out << name; // String characters return out; } // Deserialization method std::istream& MyClass::deserialize(std::istream &in) { if (in) { // Deserialize numeric values using the input stream int len=0; char comma; in >> height; in >> comma; // Separator in >> width; in >> comma; // Separator // Deserialize the std::string in >> len; // String length in >> comma; // Separator if (in && len) { std::vector<char> tmp(len); in.read(tmp.data() , len); // String characters name.assign(tmp.data(), len); } } return in; }
重載流運算子可以簡化這些運算子的使用方法:
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 可以作為更大類別的一部分進行有效的序列化和反序列化,保留它們的完整性和指標依賴性。
以上是如何在 C 中正確序列化包含 std::string 的類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!