Boost::序列化 std::unordered_map<double, std::vector<double>>

Boost::serialization of an std::unordered_map<double, std::vector<double>>

本文关键字:double lt std gt vector map 序列化 unordered Boost      更新时间:2023-10-16

我试图序列化一个简单的std::unordered_map>使用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对于行"ia>> map;"。该异常是一个"unregistered_cast"异常,根据boost文档说明:

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

任何帮助都是感激的。谢谢!

很可能您正在/也/序列化一些其他多态类型。一个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();
}

所以如果你仍然有问题,检查

  • 未定义行为
  • 用于ABI问题(是否使用与主程序相同的编译器/库版本和标志进行boost编译)