【问题标题】:Boost::serialization of an std::unordered_map<double, std::vector<double>>Boost::std::unordered_map<double, std::vector<double>> 的序列化
【发布时间】:2016-01-24 21:46:30
【问题描述】:

我正在尝试使用 boost::serialize 序列化一个简单的 std::unordered_map>。我设法保存地图就好了。当我尝试加载它时会出现此问题。 这是我的写作代码:

    double E = 250E-4;
    std::vector<double> init_vals(2,0.0);
    std::unordered_map<double, std::vector<double>> map;
    std::ofstream ofs("energy_map");
    boost::archive::binary_oarchive oa(ofs);
    map.emplace(E, init_vals);
    oa << map;

我加载地图的代码是这样的:

    std::ifstream ifs("energy_map");
    std::unordered_map <double, std::vector<double>> map;
    boost::archive::binary_iarchive ia(ifs);
    ia >> map;

我得到了“ia >> map;”行的 boost::archive::archive_exception。该异常是“unregistered_cast”异常,根据 boost 文档所述:

// 未注册的基派生关系 // void_cast_register 我不太确定为什么这行不通,因为它看起来相当简单。 (我已经编辑了原始文件中的代码以使其更简单,但这些行与我的代码中的行相同)。

感谢任何帮助。谢谢!

【问题讨论】:

    标签: c++ serialization boost vector unordered-map


    【解决方案1】:

    您很可能 /also/ 序列化了其他一些多态类型。一个 SSCCE 示例表明它可以在 GCC 上工作:

    http://paste.ubuntu.com/12963866/

    #include <boost/archive/binary_iarchive.hpp>
    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/serialization/unordered_map.hpp>
    #include <boost/serialization/vector.hpp>
    #include <fstream>
    #include <iostream>
    
    void write_map() {
        std::unordered_map<double, std::vector<double> > map;
        {
            double E = 250E-4;
            std::vector<double> init_vals(2, 0.0);
            map.emplace(E, init_vals);
        }
        {
            std::ofstream ofs("energy_map");
            boost::archive::binary_oarchive oa(ofs);
            oa << map;
        }
    }
    
    void load_map() {
        std::unordered_map<double, std::vector<double> > map;
        {
            std::ifstream ifs("energy_map");
            boost::archive::binary_iarchive ia(ifs);
            ia >> map;
        }
    
        for (auto &p : map) {
            std::cout << p.first << " -> { ";
            std::copy(p.second.begin(), p.second.end(), std::ostream_iterator<double>(std::cout, " "));
            std::cout << "}\n";
        }
    }
    
    int main() {
        write_map();
        load_map();
    }
    

    所以如果你还有问题,请检查

    • Undefined Behaviour
    • 针对 ABI 问题(您是否使用与主程序相同的编译器/库版本和标志进行了 boost 编译)

    【讨论】:

    • 谢谢!我重新检查了我的实现,发现我的保存/写入过程中有一些错误导致我写入了错误的数据。我第一次尝试这个,所以我对这个过程没有信心。
    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2019-05-18
    • 2018-09-14
    相关资源
    最近更新 更多