所有
我已经编写了代码来使用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;在它自己的范围[包括声明结构]工作就像一个魅力。