[英]boost deserialization gives me an input stream error
因此,这是我用来反序列化std :: map的一些简单代码
std::map<std::string, std::string> func(std::string filepath) {
map<std::string, std::string> filemap;
// read file
ifstream ifs(filepath, ios::in | ios::binary);
if (!ifs.good()) {
std::cout << "failed to read file" << std::endl;
return filemap;
}
string content((istreambuf_iterator<char>(ifs)), (istreambuf_iterator<char>()));
// deserialize
stringstream ss;
ss << content;
std::cout << "content length: " << content.length() << std::endl;
boost::archive::binary_iarchive ia(ss);
try {
ia >> filemap;
}
catch (const std::exception& e) {
std::cout << e.what() << std::endl;
}
return filemap;
}
这就是令我心heart的事情。 它在C ++中运行良好。 总是 。 一次又一次。 我可以反序列化地图,并随心所欲地做。 都好。
但是,我的C ++库包装在CLI中,因此我可以从C#应用程序中运行它(必须是这种方式)。 从上述C#应用程序中,
ia >> filemap;
产生“输入流错误”。 并非总是如此,我运行20次就有19次。 我一生无法理解为什么它在这里表现不同。 我快要把所有的头发都拔掉了。
我认为文件读取部分很好。 我可以从字面上打印出“内容”的内容,看起来还不错。
发生的另一件有趣的事情是,在产生第一个错误之后,如果我等待约5-10分钟,则会出现“ Debug Assertion Failed”(调试断言失败)错误对话框,显然是在vector.h中出现的。 它说“表达式:向量下标超出范围”。 我还没有弄清楚那个来源,所以我不确定它是直接相关还是只是副作用。
二进制档案不是平台无关的。 如果您使用截然不同的编译器标记(例如c ++-cli)进行构建,则布局将不兼容。
如果您需要更多类似的东西,请使用EOS Portable Archive 。
与此同时:
我可以从字面上打印出“内容”的内容,看起来还不错
它是二进制数据。 您究竟如何看待它“看起来不错”。 仅当您可以说它与已知的好东西一点一点地相同(并且您可以证明它是好东西)时,它才“看起来不错”。 如果知道这一点,则可以确认确实存在归档文件可移植性问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.