0

我有一个应用程序,我需要一些数据来持久化,所以我想到了对象序列化。我在这里找到了一个很好的例子。在它之后,这就是我想出的:

    std::stack <std::string> cards;
    cards.push("King of Hearts");
    std::ofstream ofs("<location>", std::ios::binary);
    ofs.write((char *)&cards, sizeof(cards));
    ofs.close();

然后我试图读取数据:

    std::stack<std::string> inp;
    std::ifstream ifs("<same_location>", std::ios::binary);
    ifs.read((char *)&inp, sizeof(inp));

但是应用程序在最后一行崩溃(由于某种原因,由于我的 Qt 设置,我目前无法调试)。可能的错误是什么,我该如何解决?

4

2 回答 2

0

简短的回答是:您不能像文章描述的那样序列化堆栈。我会说你只能以这种方式序列化 POD。这里的问题是您要写入的数据没有连续存储在内存中,并且通过使用ofs.write((char *)&cards, sizeof(cards));您没有考虑到指向内存中其他位置的指针。

试试这个实验:当你添加越来越多的数据时,为什么 sizeof(cards) 不会改变?

于 2014-11-20T01:26:53.613 回答
0
  1. 您的问题是您假设有关堆栈的属性不正确。std::stack 默认使用双端队列作为其支持结构,因此项目在内存中连续。
  2. 你永远不应该假设你不拥有的数据结构对于任意序列化是安全的。在 C++ 中,首选范例是使用 >> 和 << 流操作符,因为可以进行转换。
  3. sizeof() 仅获取内存中对象的大小,而不是任何数据指针可能指向的大小。sizeof() 获取容器中项目的数量将导致无用的值。

要解决这些问题,您应该编写自己的流运算符以在您知道可以控制的布局中序列化。

于 2014-11-20T01:31:59.197 回答