Не удалось загрузить данные после сериализации на диск с помощью boost - PullRequest
1 голос
/ 03 апреля 2012

Мне удалось сохранить свои данные на диск с помощью ускоренной сериализации. Однако я не смог восстановить данные. Не могли бы вы показать мне, что я сделал не так?

Спасибо,

Ниже приведены мои коды

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 в базу данных OK!
Вставьте макрос mac2 в базу данных OK!
Вставьте макрос mac3 в базу данных OK!
Вставьте порт P1 ОК!
Вставьте порт P2 ОК!
Вставьте порт P2 ОК!
Вставьте порт P3 ОК!
Вставьте порт P1 ОК!
Вставьте порт P3 ОК!
Слой mac3 найден
Macro Mac3 имеет эти порты:
Порт P3 найден
Порт P1 найден
Порт P3 макроса Mac3 использует CLOCK и dir INOUT
Порт P1 макроса mac3 использует POWER и dir OUTPUT

Ниже приведен мой результат загрузки

ОШИБКА :: Не удалось найти макрос mac3 в базе данных

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Я думаю, что вы делаете слишком много в вашем nDB::serialize методе.

Boost Serialize с удовольствием сериализует ваши карты для вас, если вы просто предоставите serialize методы для классов macro и layer. После того, как вы их написали, вы сможете упростить данный метод до следующего вида:

template<class Archive>
void nDB::serialize(Archive &ar, const unsigned int version) {
  ar & _LAYERS;
  ar & _MACROS;
}
1 голос
/ 03 апреля 2012

Я не смотрел на это подробно, но заметил, что вы открываете входной и выходной потоки по-разному ...

В save_macros:

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

В load_macros:

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

Может ли это быть проблемой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...