【问题标题】:boost serialization problem in windows vs2005, input stream errorwindows vs2005中boost序列化问题,输入流错误
【发布时间】:2011-03-03 08:35:35
【问题描述】:

我正在使用 boost 序列化来序列化对象。在 Linux 中一切正常,但在 Windows 中我在反序列化数据时遇到问题:

std::ifstream ifs(dataFilename.str().c_str(), std::ios::in | std::ios::binary);
{
    boost::archive::binary_iarchive persistenceFile(ifs);

    persistenceFile >> activeMessageAux;                
    persistenceFile >> activeMessageAux2;
}

并且总是在第二次反序列化到 activeMessageAux2 时失败,收到 boost::archive::archive_exception 输入流错误。我可以看到在文件中我有我想拥有的所有条目,所以,我不知道为什么会出现这个异常。我能做什么?有什么想法吗?

【问题讨论】:

    标签: c++ windows serialization boost


    【解决方案1】:

    如果整个序列化数据都被反序列化为activeMessageAux,为什么不能使用普通赋值填充activeMessageAux2

    std::ifstream ifs(dataFilename.str().c_str(), std::ios::in | std::ios::binary);
    {
        boost::archive::binary_iarchive persistenceFile(ifs);
        persistenceFile >> activeMessageAux;                
    }
    activeMessageAux2 = activeMessageAux;
    

    【讨论】:

    • 对不起,我根本没有解释...在我的持久性文件中,我存储了多个对象。所以,当我制作第二个>>我试图将对象存储在第二个位置......
    • @opernas :自从我使用 boost.serialization 以来已经有几年了,但我记得它不是那样工作的。如果你想要一个文件包含多个序列化对象的数据,你应该序列化/反序列化一个对象数组/std::vector。
    【解决方案2】:

    标志 std::ios::binary 仅在 Windows 中是必需的,默认模式 (ascii) 会将 \n\r 转换为 \n(反之亦然),从而破坏任何非文本数据。

    你在导出中也设置了吗?

    【讨论】:

    • 我这样保存... std::ofstream ofs(dataFilename.str().c_str(), std::ios::binary | std::ios::app); boost::archive::binary_oarchive persistenceFile(ofs);持久性文件
    • 否 - 如果它在两个地方都是二进制的,那么它是正确的。我看到的唯一一件事 - 你每次都在追加。会不会因为开发存在一些损坏的数据,然后删除文件一次就可以清理一切?
    【解决方案3】:

    终于找到了解决办法。读取一个对象,用tellg保存位置,然后我可以读取下一个对象。 :-D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 2015-07-22
      相关资源
      最近更新 更多