在Visual Studio 2012中加载Boost :: Serialization text_iarchive时访问冲突

时间:2014-08-22 11:10:31

标签: c++ visual-studio-2012 serialization boost access-violation

所有

我已经编写了代码来使用boost序列化来序列化我们的API调用。正在Linux上执行保存并在Windows上加载,所以我开始使用text_?archive。我能够轻松地在linux上保存和加载存档,但是当我切换到Windows时,在读取第一个结构时我创建了text_iarchive后,我得到了访问冲突。

使用调试器逐步执行升级代码后,我发现了问题。

在" boost / archive / basic_text_iprimitive.hpp"我在第84行获得了访问冲突:

template<class T>
void load(T & t)
{
    if(is >> t)
        return;
    boost::serialization::throw_exception(
        archive_exception(archive_exception::input_stream_error)
    );
}

具体而言,崩溃发生在&gt;&gt;内部。吨。我已经尝试了一些方法来解决这个问题,但是由于它是增强代码,我宁愿没有依赖于修改代码的解决方案。第一个修复是添加:

std::stringstream ss;
std::string str;
is >> str;
ss.str(str);
ss >> t;
if ( is )
    return;
boost::serialization::throw_exception(
    archive_exception(archive_exception::input_stream_error));

不幸的是,这很有效,我的程序一直在运行。这是一个可怕的可怕的黑客,所以我尝试了别的东西。调用函数如下所示:

void load(version_type & t){
    unsigned int v;
    load(v);
    t = version_type(v);
}

相当温和。我首先尝试将unsigned int初始化为0,但这没有做任何事情。然后我的同事建议将unsigned int更改为int [虽然开玩笑]。果然它有效。同样,这是对增强代码的更改,因此我不想保留修复程序。

不幸的是,除了我无法分享的代码之外,我无法重现这个问题。我已经能够制作一个新的Visual Studio项目并加载文件了,所以我不确定我可能会改变哪些设置会导致这样的问题。

任何帮助将不胜感激!

修改

我能解决这个问题。我仍然不确定原因,但问题源于我调用序列化代码的方式。

我的意思是:

int main()
{
    struct s;
    std::ifstream infile("output.txt");
    std::ifstream types("types.txt");        

    boost::archive::text_iarchive ia(infile);

    int type = 0;
    types >> type;

    switch( type )
    {
      case 1:
       ia >> s;
    }

    return 0;
}

整理&#34;案例1&#34;在它自己的范围[包括声明结构]工作就像一个魅力。

0 个答案:

没有答案