Сериализация карты объектов в xml с использованием boost::serialization

Приведенный ниже пример сериализации взят из списка рассылки Boost, почти то же самое, что я хотел бы сделать. Однако я изменил архив, чтобы он сериализовался в XML. Компиляция не завершится ошибкой, если я сериализую в двоичный файл, но произойдет ошибка при сериализации в xml. Сбой компиляции в basic_xml_oarchive.hpp в следующем методе:

// boost code where compile fails
template<class T>
void save_override(T & t, BOOST_PFTO int)
{
    // If your program fails to compile here, its most likely due to
    // not specifying an nvp wrapper around the variable to
    // be serialized.
    BOOST_MPL_ASSERT((serialization::is_wrapper<T>));
    this->detail_common_oarchive::save_override(t, 0);
}

Кажется, я сделал недостаточно, чтобы сериализовать объект std::map<int, CSomeData>, есть идеи, как это исправить?


Моя реализация сериализации:

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

using namespace std;

// This is a test class to use as the map data.
class CSomeData {
    public:
        CSomeData(){};
        CSomeData(float f0, string str0)
        {
            m_f0 = f0;
            m_str0 = str0;
        }

        float m_f0;
        string m_str0;

    private:
        friend class boost::serialization::access;

        template<class Archive>
        void serialize(Archive &ar, const unsigned int version)
        {
            ar & m_f0;
            ar & m_str0;
        }
};

// This is the class we really want to try serializing.
class CTest {
    public:
        CTest(){};
        CTest(int nNumber)
        {
            m_nNumber = nNumber;

            // Fill with some dummy data.
            m_mTst.insert(make_pair(0, CSomeData(0.23f, "hi hi hi")));
            m_mTst.insert(make_pair(1, CSomeData(7.65f, "second one")));
            m_mTst.insert(make_pair(2, CSomeData(9.23f, "third one")));
            m_mTst.insert(make_pair(3, CSomeData(5.6766, "chosen one")));
        }
        ~CTest(){};

        save()
        {
            std::ofstream ofs("filename");

            // Write class instance to archive. Writing seems to work ok.
            boost::archive::xml_oarchive oa(ofs);
            oa << BOOST_SERIALIZATION_NVP(*this);
        }

        int m_nNumber;

    private:
        map<int, CSomeData> m_mTst;

        friend class boost::serialization::access;

        template<class Archive>
        void serialize(Archive &ar, const unsigned int version)
        {
            ar & m_nNumber;
            ar & m_mTst;
        }
};

person Seth    schedule 19.07.2010    source источник
comment
Я думаю, что моя проблема в том, что сериализация не поддерживается в codegear. blogs.embarcadero.com/ddean/2009/09/23/34847   -  person Seth    schedule 19.07.2010


Ответы (1)


Я считаю, что вам нужно пометить членов именем для сериализации XML. Это указывает имя элемента для использования в XML. т.е. используйте что-то вроде:

ar & BOOST_SERIALIZATION_NVP(m_f0);

или (лучше в этом случае):

ar & make_nvp("field0", my_f0);

Теги будут игнорироваться для двоичной сериализации. Подробнее здесь:

http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/wrappers.html

person jon-hanson    schedule 19.07.2010
comment
Это не сработало, и я уже использовал макрос BOOST_SERIALIZATION_NVP - person Seth; 19.07.2010
comment
Все еще умирал при связывании ... ссылка на codegear, которую я разместил выше, говорит, что сериализация не поддерживается. Спасибо за вашу помощь в любом случае. - person Seth; 20.07.2010