繁体   English   中英

Boost反序列化给我输入流错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM