2

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)
        {
            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;
        }
};
1

1 Answer 1

4

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

Sign up to request clarification or add additional context in comments.

2 Comments

That didn't work, and I was already using the BOOST_SERIALIZATION_NVP macro
Still died at linking.. the codegear link I posted above says serialization is not supported. Thanks for you your help anyway.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.