boost deserialization给我一个输入流错误

时间:2017-10-27 15:35:18

标签: c# c++ serialization boost

所以,这里有一些简单的代码我用来反序列化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。它说“表达式:向量下标超出范围”。我还没有弄清楚那个的来源,所以我不确定它是直接相关还是只是副作用。

1 个答案:

答案 0 :(得分:0)

二进制存档不依赖于平台。如果使用完全不同的编译器标志(例如c ++ - cli)构建,则布局将不兼容。

如果您需要更类似的内容,请使用EOS Portable Archive

同时

  

我可以打印出“内容”的内容,看起来很好

这是二进制数据。你怎么能看到它“看起来很好”。只有当你能说它与已知的好东西(你可以证明它是好的)有点相同时,它“看起来很好”。如果您知道这一点,则确认存档可移植性确实存在问题。

相关问题