2

我正在使用 boost 进行序列化:

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 回答
0

只需为版本创建一个整数并首先对其进行序列化。

int param_ver = 1;
xml << BOOST_SERIALIZATION_NVP(param_ver);
xml << BOOST_SERIALIZATION_NVP(param1value);
xml << BOOST_SERIALIZATION_NVP(param2value);
xml << BOOST_SERIALIZATION_NVP(param3value);
xml << BOOST_SERIALIZATION_NVP(param4value);
xml << BOOST_SERIALIZATION_NVP(param5value);

加载时首先阅​​读版本并使用它

int param_ver;
xml >> BOOST_SERIALIZATION_NVP(param_ver);
xml >> BOOST_SERIALIZATION_NVP(param1value);
xml >> BOOST_SERIALIZATION_NVP(param2value);
xml >> BOOST_SERIALIZATION_NVP(param3value);
xml >> BOOST_SERIALIZATION_NVP(param4value);
if(param_ver>0)
{
  xml >> BOOST_SERIALIZATION_NVP(param5value);
}
于 2017-11-27T16:58:11.493 回答