Search code examples
c++serializationc++11boostboost-serialization

boost serialization for the std::list type varaible not working


how do i serialize the std::allocator type in struct and for reference please see the below code as example :

//SimpleData.hpp

#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp> 
#include <boost/serialization/optional.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/list.hpp>

namespace A
{

    struct FullData 
    {
        FullData();
        FullData(const parameter_strings & parms);

        virtual ~FullData();

        std::string country;
        int pincode;

        private :
        friend class boost::serialization::access;
        template<class Archive>
            void serialize(Archive &ar, const unsigned int version)
            {      
                ar & country;
                ar & pincode;
            } 

         typedef std::list<FullData> FullDataInfo; // what should be done to serialize this data 
    };

}

// SimpleData.cpp
#include "SimpleData.hpp" 
#include <boost/serialization/export.hpp>

namespace A
{
    FullData::FullData()
    {

    }

    FullData::~FullData()
    {

    }

    FullData::FullData(const parameter_strings & parms): detail(parms)
    {

        // impelmentation
    }

}

BOOST_CLASS_EXPORT_IMPLEMENT(A::FullData)
BOOST_CLASS_IMPLEMENTATION(A::FullData    , boost::serialization::object_serializable)
BOOST_CLASS_TRACKING(A::FullData          , boost::serialization::track_never)

I don't know how to serialize the typedef FullData::inst_list FullDataInfo;

Thanks,


Solution

  • You just write the code:

    int main()
    {
        boost::archive::text_oarchive oa(std::cout);
    
        A::FullData data1({ { "key1", "value1" }, { "key2", "value2" } });
        data1.pincode = 1234;
        data1.country = "ES";
        A::FullData data2({ { "key3", "value3" }, { "key4", "value4" } });
        data2.pincode = 4321;
        data2.country = "UK";
    
        A::FullData::FullDataInfo list { data1, data2 };
    
        oa << list;
    }
    

    See it Live On Coliru

    Output:

    22 serialization::archive 10 0 0 2 0 2 ES 1234 2 UK 4321
    

    Full Code Listing

    #include <boost/archive/text_oarchive.hpp>
    #include <boost/serialization/access.hpp>
    #include <boost/serialization/base_object.hpp> 
    #include <boost/serialization/optional.hpp> 
    #include <boost/serialization/map.hpp> 
    #include <boost/serialization/shared_ptr.hpp>
    #include <boost/serialization/list.hpp>
    
    namespace A
    {
        typedef std::map<std::string, std::string> parameter_strings;
        struct FullData 
        {
            FullData() : pincode(0) {}
            FullData(const parameter_strings & parms) : pincode(0), detail(parms) {}
    
            virtual ~FullData() {}
    
            std::string country;
            int pincode;
    
          private:
            friend class boost::serialization::access;
            template<class Archive>
                void serialize(Archive &ar, unsigned int)
                {      
                    ar & country;
                    ar & pincode;
                } 
    
             parameter_strings detail;
    
          public:
             typedef std::list<FullData> FullDataInfo; // what should be done to serialize this data 
        };
    
    }
    
    // SimpleData.cpp
    #include <boost/serialization/export.hpp>
    
    BOOST_CLASS_EXPORT_IMPLEMENT(A::FullData)
    BOOST_CLASS_IMPLEMENTATION(A::FullData    , boost::serialization::object_serializable)
    BOOST_CLASS_TRACKING(A::FullData          , boost::serialization::track_never)
    
    int main()
    {
        boost::archive::text_oarchive oa(std::cout);
    
        A::FullData data1({ { "key1", "value1" }, { "key2", "value2" } });
        data1.pincode = 1234;
        data1.country = "ES";
        A::FullData data2({ { "key3", "value3" }, { "key4", "value4" } });
        data2.pincode = 4321;
        data2.country = "UK";
    
        A::FullData::FullDataInfo list { data1, data2 };
    
        oa << list;
    }