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

如何序列化包含 std::string 的 C 类?

DDD
DDD原创
2024-12-08 18:57:13574浏览

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

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

序列化包含 std::string 的类会因为字符串的指针而面临挑战以自然为基础。将类转换为 char* 并将其写入文件的标准技术将不起作用,就像对于原始数据类型一样。

自定义序列化函数

标准解决方法涉及为类创建自定义序列化和反序列化函数。这些函数以受控方式处理类数据的读写。

示例函数

对于包含名为“name”的 std::string 的类,序列化和反序列化函数可以实现如下:

std::ostream& MyClass::serialize(std::ostream& out) const {
    out << height;
    out << ',' // number separator
    out << width;
    out << ',' // number separator
    out << name.size(); // serialize size of string
    out << ',' // number separator
    out << name; // serialize characters of string
    return out;
}

std::istream&amp; MyClass::deserialize(std::istream&amp; in) {
    if (in) {
        int len = 0;
        char comma;
        in >> height;
        in >> comma; // read in the separator
        in >> width;
        in >> comma; // read in the separator
        in >> len; // deserialize size of string
        in >> comma; // read in the separator
        if (in &amp;&amp; len) {
            std::vector<char> tmp(len);
            in.read(tmp.data(), len); // deserialize characters of string
            name.assign(tmp.data(), len);
        }
    }
    return in;
}

重载流运算符

为了更方便使用,您可以重载类的流运算符:

std::ostream &amp;operator<<(std::ostream&amp; out, const MyClass &amp;obj) {
    obj.serialize(out);
    return out;
}

std::istream &amp;operator>>(std::istream&amp; in, MyClass &amp;obj) {
    obj.deserialize(in);
    return in;
}

使用这些函数和重载,您现在可以序列化和反序列化包含 std 的类:: 只需使用流运算符即可字符串。

以上是如何序列化包含 std::string 的 C 类?的详细内容。更多信息请关注PHP中文网其他相关文章!

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