2013-02-11 4 views
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)으로 직렬화 될 때 문서 작성 방법을 찾았습니다.

답변

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!"; 
    } 
} 
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); 
} 
를 사용