Boost ::序列化std :: unordered_map <double,std :: vector <double =“”>&gt;

时间:2015-10-25 20:36:39

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

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

    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;

我获得了一行的boost :: archive :: archive_exception&#34; ia&gt;&gt;地图;&#34 ;.例外是&#34; unregistered_cast&#34;根据boost文档声明的异常:

  

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

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

最有可能的是,您还要/序列化其他一些多态类型。 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();
}

因此,如果您仍有问题,请检查

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