从ifStream中提升Binary_iarchive

时间:2016-09-06 05:35:46

标签: c++ xcode serialization boost

我目前正在尝试使用boost序列化和反序列化对象。我的代码不起作用,所以我简化了示例,我得到了完全相同的结果。我在这做错了什么? Boost显然有效。

包括

#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

代码

 std::ofstream outStream(fileName);
 if(outStream.is_open())
 {   
    boost::archive::binary_oarchive archiveOut(outStream);
    archiveOut << 1;   
    outStream.close();
 }

此位调用正常..文件已创建但是它是1.3MB(!?!?!)。那似乎非常错误。

 std::ifstream inStream(fileName);
 if(inStream.is_open())
 {   
    boost::archive::binary_iarchive archiveIn(inStream);
    int value = 0;
    archiveIn >> value;   
    inStream.close();
 }

在实例化binary_iarchive之后发生错误,我可以在调试器中跳过此调用,但在下一步中它会崩溃。即在binary_iarchive()之后但在int value = 0之前;

    boost::archive::binary_iarchive archiveIn(inStream);
  

*错误:无法分配区域   * 在malloc_error_break中设置一个断点来调试libc ++ abi.dylib:以std :: bad_alloc类型的未捕获异常终止:   的std :: bad_alloc的

我无法在这里看到我做错了什么。

该项目使用clang构建,并使用XCode开发。

  • 是否存在使用boost二进制序列化的常见问题?

  • 哪些方法可以帮助我理解我在这段代码中做错了什么?

此致

注意:

其他帖子类似,但不完全是这个问题。我在上面的帖子中尝试了解决方案。

Stackoverflow Boost Serialisation Question

更新

bool saveDatabase(std::string fileName)
{
        std::ofstream outStream(fileName);
        if(outStream.is_open())
        {
            boost::archive::binary_oarchive archiveOut(outStream);
            archiveOut << 1;
            outStream.close();
            return true;
        }
        else
        {
            LOG(INFO) << "ERROR: Could not open file stream to save database";
        }
    return false;
}

1 个答案:

答案 0 :(得分:0)

  1. 第一

    archiveOut << 1;   
    

    您只能使用Boost来序列化左值。 (寻找&#34;堆叠&#34;在http://www.boost.org/doc/libs/1_61_0/libs/serialization/doc/special.html#objecttracking

  2. std::ofstream outStream(fileName);
    if(outStream.is_open())
    {
        outStream << 1;
        outStream.close();
        return true;
    }
    

    这甚至不使用提升。在大多数平台上,该文件将为1个字节。如果没有,那么它没有被写入,或者你正在查看错误的文件。

  3. else
    {
        LOG(INFO) << "ERROR: Could not open file stream to save database";
        throw;
    }
    

    如果没有待处理的异常,则无法重新抛出。 what does "throw;" outside a catch block do?