开发者

Serializing a map of objects to xml using boost::serialization

开发者 https://www.devze.com 2023-01-08 01:48 出处:网络
The serialization example below is from the boost mailing list which is pretty much the same as what I would like to do. However, I have changed the archive so that it will serialize to XML. The compi

The serialization example below is from the boost mailing list which is pretty much the same as what I would like to do. However, I have changed the archive so that it will serialize to XML. The compile does not fail if I serialize to binary, but it fails when serializing to xml. The compile fails in basic_xml_oarchive.hpp in the following method:

// 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);
}

It seems I haven't done enough to allow the std::map<int, CSomeData> object to be serialized, any ideas on how to fix this?


My serialization implementation:

#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)
        {
     开发者_Go百科       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;
        }
};


I believe you need to tag the members with a name for XML serialisation. This specifies the element name to use in the XML. I.e. use something like:

ar & BOOST_SERIALIZATION_NVP(m_f0);

or (better in this case):

ar & make_nvp("field0", my_f0);

The tags will be ignored for binary serialisation. More details here:

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

0

精彩评论

暂无评论...
验证码 换一张
取 消