Загрузка класса из XML с расширенной сериализацией - PullRequest
1 голос
/ 20 апреля 2011

Я пытаюсь загрузить простой класс из файла XML, но получаю следующую ошибку:

error: no match for 'operator>>' in 'xml >> boost::serialization::make_nvp(const
char*, T&) [with T = Options](((Options&)(& o)))'

Должно быть, что-то глупо, я делаю неправильно, но я не могу понять, что. У кого-нибудь есть идея? Вот мой код:

#include <fstream>
#include <boost/serialization/string.hpp>
#include <boost/serialization/map.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/nvp.hpp>

class Options {
public:
    Options() {
        SetInteger("screenWidth", 1024);
        SetInteger("screenHeight", 768);
    }
    void SetInteger(const std::string& name, int value) {
        integers_[name] = value;
    }
private:
    std::map<std::string, int> integers_;

    friend class boost::serialization::access;
    template<class archive>
    void serialize(archive& ar, const unsigned int version)
    {
        using boost::serialization::make_nvp;
        ar & make_nvp("integers", integers_);
    }
};

int main() {
    Options o;
    std::ofstream ifs("input.xml");
    boost::archive::xml_oarchive xml(ifs);
    xml >> boost::serialization::make_nvp("options", o); // error
}

1 Ответ

3 голосов
/ 20 апреля 2011

Итак, из вашего кода и того, что вы пишете, вы пытаетесь прочитать.В этом случае вы не должны использовать ofstream и xml_oarchive, но ifstream и xml_iarchive .

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>

....

//for read
std::ifstream ifs("input.xml");
boost::archive::xml_iarchive xmlIn(ifs);
xmlIn >> boost::serialization::make_nvp("options", o); 

//for write
std::ofstream ofs("output.xml");
boost::archive::xml_oarchive xmlOut(ofs);
xmlOut << boost::serialization::make_nvp("options", o); 
...