使用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中文網其他相關文章!