首页 >后端开发 >C++ >如何使用 std::string 成员正确序列化 C 类?

如何使用 std::string 成员正确序列化 C 类?

Susan Sarandon
Susan Sarandon原创
2024-12-03 14:00:20805浏览

How to Properly Serialize a C   Class with a std::string Member?

使用 std::string 成员序列化一个类

当序列化包含 std::string 的类时,您可能会遇到“地址越界”错误,因为 std::string 是指向堆分配内存的动态数据结构。将类转换为 char* 并将其写入文件只会捕获字符串的内存地址,而不是其实际内容。

要解决此问题,请考虑以下方法:

  1. 自定义序列化和反序列化函数:

    实现 void类中的 MyClass::serialize(std::ostream) 和 void MyClass::deserialize(std::istream) 成员函数。这些函数将处理所有成员变量的序列化和反序列化,包括std::string。

  2. 序列化逻辑:

    在serialize( ),将 std::string 的大小写入流,后跟其字符。这确保字符串数据与类对象分开序列化。

  3. 反序列化逻辑:

    在 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;
}
  1. 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn