所以,这里有一些简单的代码我用来反序列化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;
}
这就是令我心悸的事情。它在C ++中运行良好。 始终即可。一次又一次。我可以反序列化地图,并用它做任何我想做的事情。一切都好。
然而,我的C ++库包装在CLI中,以便我可以从C#应用程序运行它(必须这样)。从所说的C#应用程序,
ia >> filemap;
产生“输入流错误”。并非总是如此,我运行20次中的19次。我不能为我的生活理解为什么它在这里表现不同。我接近把头发拉出来了。
我认为文件阅读部分很好。我可以打印出“内容”的内容,看起来很好。
另一个有趣的事情是,在产生第一个错误之后,如果我等待约5-10分钟,则会出现“Debug Assertion Failed”错误对话框,显然是来自vector.h。它说“表达式:向量下标超出范围”。我还没有弄清楚那个的来源,所以我不确定它是直接相关还是只是副作用。
答案 0 :(得分:0)
二进制存档不依赖于平台。如果使用完全不同的编译器标志(例如c ++ - cli)构建,则布局将不兼容。
如果您需要更类似的内容,请使用EOS Portable Archive。
同时
我可以打印出“内容”的内容,看起来很好
这是二进制数据。你怎么能看到它“看起来很好”。只有当你能说它与已知的好东西(你可以证明它是好的)有点相同时,它“看起来很好”。如果您知道这一点,则确认存档可移植性确实存在问题。