Boost logo

Boost Users :

Subject: [Boost-users] serialization of recursive objects
From: kean (kean.mariotti_at_[hidden])
Date: 2012-11-27 05:13:57


Hello everybody,

I defined the following objects to be serialized:

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

template<class T>
class MyRecursiveObject
{
    friend class boost::serialization::access;
    
    public:
        T element;
        std::vector<MyRecursiveObject&lt;T> > children;
    
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & element;
            ar & children;
        }
};

I then run the following code:

int main()
{
    //MyRecursiveObject initialization
    MyRecursiveObject<MyElementObject> rec_object;
    rec_object.children.push_back(MyRecursiveObject<MyElementObject>());
   
rec_object.children[0].children.push_back(MyRecursiveObject<MyElementObject>());

    //create vector of pointers to MyRecursiveObject's elements
    vector<MyElementObject *> elt_ptrs;
    elt_ptrs.push_back(&rec_object.element);
    elt_ptrs.push_back(&rec_object.children[0].element);
    elt_ptrs.push_back(&rec_object.children[0].children[0].element);

    //serialize MyRecursiveObject and the vector of pointers
    {
        ofstream ofs("filename");
        boost::archive::text_oarchive oa(ofs);
        oa << rec_object;
        oa << elt_ptrs;
    }

    //create new MyRecursiveObject and vector of pointers for
deserialization
    MyRecursiveObject<MyElementObject> rec_object_deserialized;
   
rec_object_deserialized.children.push_back(MyRecursiveObject<MyElementObject>());
   
rec_object_deserialized.children[0].children.push_back(MyRecursiveObject<MyElementObject>());
    vector<MyElementObject *> elt_ptrs_deserialized;
    
    //deserialize
    {
        ifstream ifs("filename");
        boost::archive::text_iarchive ia(ifs);
        ia >> rec_object_deserialized;
        ia >> elt_ptrs_deserialized;
    }

    //compare deserialized pointers
    cout<<"elt_ptrs first level="<<elt_ptrs_deserialized[0]
    &lt;&lt;&quot;
expected=&quot;&lt;&lt;&amp;rec_object_deserialized.element&lt;&lt;endl;
    
    cout&lt;&lt;&quot;elt_ptrs second
level=&quot;&lt;&lt;elt_ptrs_deserialized[1]
    &lt;&lt;&quot;
expected=&quot;&lt;&lt;&amp;rec_object_deserialized.children[0].element&lt;&lt;endl;
    
    cout&lt;&lt;&quot;elt_ptrs third
level=&quot;&lt;&lt;elt_ptrs_deserialized[2]
    &lt;&lt;&quot;
expected=&quot;&lt;&lt;&amp;rec_object_deserialized.children[0].children[0].element&lt;&lt;endl;

    return 0;
}

And I always get an output similar to the following one:

elt_ptrs first level=&lt;b>0x7fff57c787c0* expected=*0x7fff57c787c0*
elt_ptrs second level=*0x18e7020* expected=*0x18e7020*
elt_ptrs third level=*0xffff8000ab5564f0* expected=*0x18e7450*

As can be seen from the output I manage to deserialize pointers that point
to elements down to the second recursion level of MyRecursiveObject. As soon
as I try to do it with pointers to the third level or even deeper the
deserialization fails.

Am I using boost::serialization wrongly?

Note that the MyRecursiveObject is always successfully deserialized, no
matter how many levels it has. I encounter the problem only deserializing
pointers to its elements.

Thank you in advance
Kean

--
View this message in context: http://boost.2283326.n4.nabble.com/serialization-of-recursive-objects-tp4639105.html
Sent from the Boost - Users mailing list archive at Nabble.com.

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net