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