2

私はブーストでシリアル化を行っています:

bool saveParams(std::string filename)
{
    using boost::serialization::make_nvp;
    std::ofstream ofs(filename.c_str());
    if(ofs.is_open() == false) return false;
    boost::archive::xml_oarchive xml(ofs);

    xml << make_nvp("Param1", param1value);
    xml << make_nvp("Param2", param2value);
    xml << make_nvp("Param3", param3value);
    xml << make_nvp("Param4", param4value);
}

読み込みは次のように行います:

bool loadParams(std::string filename)
{
    using boost::serialization::make_nvp;
    std::ifstream ifs(filename.c_str());
    if(ifs.is_open() == false) return false;
    boost::archive::xml_iarchive xml(ifs);

    xml >> BOOST_SERIALIZATION_NVP(param1value);
    xml >> BOOST_SERIALIZATION_NVP(param2value);
    xml >> BOOST_SERIALIZATION_NVP(param3value);
    xml >> BOOST_SERIALIZATION_NVP(param4value);
}

次に、Param5 を追加します。追加のバージョン情報を追加して、ロード時に対応するにはどうすればよいですか? クラスがでシリアル化されているときにそれを行う方法をドキュメントで見つけましたBOOST_CLASS_VERSION(serialized_class, version)

4

2 に答える 2

0

だから私は私の醜い解決策を答えとして提示します。より良い解決策が現れるとき、私はそれを受け入れます。

私は例外を除いてバージョンに対処しました:

bool loadParams(std::string filename)
{
    using boost::serialization::make_nvp;
    std::ifstream ifs(filename.c_str());
    if(ifs.is_open() == false) return false;
    boost::archive::xml_iarchive xml(ifs);

    try
    {
       xml >> BOOST_SERIALIZATION_NVP(param1value);
       xml >> BOOST_SERIALIZATION_NVP(param2value);
       xml >> BOOST_SERIALIZATION_NVP(param3value);
       xml >> BOOST_SERIALIZATION_NVP(param4value);
    }
    catch(boost::archive::archive_exception e)
    {
       qDebug()<<"Exception: "<<e.what();
    }
    try
    {
       xml >> BOOST_SERIALIZATION_NVP(newParam);
    }
    catch(boost::archive::archive_exception e)
    {
       qDebug()<<"New version!";
    }
}
于 2013-02-20T10:18:54.050 に答える