使用 boost 序列化到磁盘后无法加载数据

Couldn't load data back after serializing onto disk using boost

本文关键字:加载 数据 磁盘 boost 序列化 使用      更新时间:2023-10-16

我能够使用boost序列化将数据保存到磁盘上。但是,我无法取回数据。你能告诉我我做错了什么吗?

谢谢你,

以下是我的代码

void nDB::save_macros(string filename) {
    std::ofstream ofs(filename.c_str(), std::ios::out | std::ios::binary);
    //assert(ofs.good());
    boost::archive::binary_oarchive oa(ofs);
    oa << this;
}
void nDB::load_macros(string filename) {
    std::ifstream ifs(filename.c_str());
    //assert(ifs.good());
    boost::archive::binary_iarchive ia(ifs);
    nDB *db = new nDB;
    ia >> db;
    *this = *db;
}

下面是我的序列化实例化

template<class Archive>
void nDB::serialize(Archive &ar, const unsigned int version) {
    boost::unordered_map<string,macro*,myhash,cmp_str>::iterator M_IT;
    boost::unordered_map<string,layer*,myhash,cmp_str>::iterator L_IT;
    for (L_IT = _LAYERS.begin();L_IT != _LAYERS.end();L_IT++) {
        string tmpstr = L_IT->first;
        //ar & L_IT->first;
        ar & tmpstr;
        ar & *(L_IT->second);
    }
    for (M_IT = _MACROS.begin();M_IT != _MACROS.end();M_IT++) {
       string tmpstr = M_IT->first;
       //ar & M_IT->first;
       ar & tmpstr;
       ar & *(M_IT->second);
    }
}

以下是我保存运行的运行结果:

将mac1宏插入数据库确定
将mac2宏插入数据库确定
将mac3宏插入数据库确定
插入端口P1 OK
插入端口P2 OK
插入端口P2 OK
插入端口P3 OK
插入端口P1 OK
插入端口P3 OK
找到mac3层
宏mac3具有以下端口:
找到端口P3
找到端口P1
宏mac3的端口P3已使用CLOCK和dir INOUT
宏mac3的端口P1已使用POWER和dir OUTPUT

下面是我加载运行的结果

错误::在数据库中找不到宏mac3

我认为您在nDB::serialize方法中做得太多了。

如果您只为macrolayer类提供serialize方法,BoostSerialize将很乐意为您序列化映射。一旦你写了这些,你应该能够将给定的方法简化为这样的东西:

template<class Archive>
void nDB::serialize(Archive &ar, const unsigned int version) {
  ar & _LAYERS;
  ar & _MACROS;
}

我没有详细介绍它,但我注意到您打开输入流和输出流的方式不同。。。

save_macros:中

std::ofstream ofs(filename.c_str(), std::ios::out | std::ios::binary);

load_macros:中

std::ifstream ifs(filename.c_str());

这可能是问题所在吗?