首页 >后端开发 >C++ >如何安全地序列化和反序列化包含 std::string 的 C 类?

如何安全地序列化和反序列化包含 std::string 的 C 类?

Linda Hamilton
Linda Hamilton原创
2024-12-05 12:33:14956浏览

How to Safely Serialize and Deserialize a C   Class Containing an std::string?

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

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