|
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<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]
<<"
expected="<<&rec_object_deserialized.element<<endl;
cout<<"elt_ptrs second
level="<<elt_ptrs_deserialized[1]
<<"
expected="<<&rec_object_deserialized.children[0].element<<endl;
cout<<"elt_ptrs third
level="<<elt_ptrs_deserialized[2]
<<"
expected="<<&rec_object_deserialized.children[0].children[0].element<<endl;
return 0;
}
And I always get an output similar to the following one:
elt_ptrs first level=<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