c++ - 如何在 C++ 中使用对象序列化保存和加载 std::string?

标签 c++ serialization

我有像这个 POD 结构这样简单的东西......

struct Actor
{
    string name; 
    int hp;
};

稍后,为了简单起见,我使用...将结构保存到文件中

 ofstream_obj.write((char *)&PC, sizeof(Actor));

然后,我试着读回文件。它加载了数据,但在退出时给出了一个丑陋的异常,指向 xutility 的行: *_Pnext != 0

inline void _Container_base12::_Orphan_all()
    {   // orphan all iterators
 #if _ITERATOR_DEBUG_LEVEL == 2
    if (_Myproxy != 0)
        {   // proxy allocated, drain it
        _Lockit _Lock(_LOCK_DEBUG);

        for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter;
            *_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
            (*_Pnext)->_Myproxy = 0;
        _Myproxy->_Myfirstiter = 0;
        }
 #endif /* _ITERATOR_DEBUG_LEVEL == 2 */
    }

放弃后,我将 std::string 更改为 char name[20],再次尝试整个过程,它运行良好。加载回 std::string 有什么不同吗?不是调用std::string的拷贝构造函数吗?

最佳答案

std::string 在内部持有一个指针,指向在堆上分配的实际字符串数据。

write(char*, size_t) AT ALL 不考虑内部类型(和关联的复制构造函数)。这意味着您正在编写一个指向文件的指针,但它永远不会起作用。

要正确修复它,您需要实际序列化以正确写出字符串(例如写入长度,然后是数据)

关于c++ - 如何在 C++ 中使用对象序列化保存和加载 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23176758/

相关文章:

c++ - 语义分析后拦截编译

java - Java 如何反序列化 Class 对象,同时保留它们对当前加载的 Class 对象的标识?

javascript - JSON.parse 没有在 javascript 中创建 json 对象

c++ - 如何修复 C/C++ 中的堆损坏?

c++ - 寻求有关消耗多个值的 C++11 printf 格式参数的解释

c++ - 如何将成员函数分配给使用 std::function 定义的成员变量?

c++ - 如何在策略之间共享成员?

c# - MassTransit 弄乱了我的字符串数据

c# - 使用 Newtonsoft JSON 处理循环引用

serialization - 如何让 Spark 使用 Kryo 序列化对象?