使用 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();
此自定义方法可确保 std::string 正确序列化并反序列化。此外,它还提供了一种使用流运算符(>)来序列化和反序列化对象的便捷方法。
以上是如何安全地序列化和反序列化包含 std::string 的 C 类?的详细内容。更多信息请关注PHP中文网其他相关文章!