It just occured to me that this is an old problem which has now been fixed in the CVS. The problem occurs with version 1.32 when addresses of objects are stored in containers. The problem occurs because objects are deserialized to a temporary and then moved into the container. This has been addressed by adding the function reset_object_address calling it during the deserialzation. This is explained in the CVS version. Robert Ramey Robert Ramey wrote:
I'll look at this. Give me a couple of days.
Robert Ramey
James Conrad wrote:
I'm evaluating the Boost.Serialization for use internal use as an interchange format between a number of loose knit projects, and I've run into a bit of trouble.
I'm using Vc 7.1 in Visual Studio .NET 2003.
It seems to me that, if I serialize an object first in an std::vector, and then serialize it later by pointer, that there is trouble reading it back.
I boiled down the reproduction case to as little code as possible below.
When newPolygon (below) is loaded from the archive, I get a bogus pointer for m_pLastVertex. If I serialize using a binary archive, I hit an assert in basic_iarchive.cpp line 371:
assert(new_cid == cid);
Where cid is 576 and new_cid is 2.
Any help with this would be appriciated,
Thanks in advance, -james conrad
#include <fstream>
#define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
#include
#include #include
#include class Vector3 { public: Vector3() {} Vector3( float x, float y, float z ) : _x(x), _y(y), _z(z) {}
friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(_x); ar & BOOST_SERIALIZATION_NVP(_y); ar & BOOST_SERIALIZATION_NVP(_z); }
float _x,_y,_z; };
BOOST_CLASS_EXPORT_GUID(Vector3, "Vector3")
class Polygon { public: Polygon() : m_pLastVertex( NULL ) {}
friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & BOOST_SERIALIZATION_NVP(m_vertices); ar & BOOST_SERIALIZATION_NVP(m_pLastVertex); }
void addVertex( const Vector3& vert ) { m_vertices.push_back( vert ); m_pLastVertex = &m_vertices.back(); }
std::vector<Vector3> m_vertices; Vector3* m_pLastVertex; };
BOOST_CLASS_EXPORT_GUID(Polygon, "Polygon")
int main( int argc, char* argv[] ) { // create class instance Polygon poly; poly.addVertex( Vector3( 0.0f, 1.0f, 0.0f ) ); poly.addVertex( Vector3( 1.0f, 0.12565f, 0.2f ) ); poly.addVertex( Vector3( 15.0f, 1.22f, 6.7f ) ); poly.addVertex( Vector3( 1.43f, 1.55f, 2.5f ) );
// create and open a character archive for output std::ofstream ofsx( "testout.xml" ); boost::archive::xml_oarchive oax( ofsx );
// write class instance to archive oax << BOOST_SERIALIZATION_NVP(poly);
// close archive ofsx.close();
Polygon newPoly;
// create and open an archive for input std::ifstream ifs("testout.xml", std::ios::binary); boost::archive::xml_iarchive ia(ifs); // read class state from archive ia >> BOOST_SERIALIZATION_NVP( newPoly ); // close archive ifs.close();
return 0; }
Here is an example of the .xml output:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!DOCTYPE boost_serialization>
<poly class_id="0" tracking_level="1" version="0" object_id="_0"> <count>4</count> <item class_id="2" tracking_level="1" version="0" object_id="_1"> <_x>0 <_y>1 <_z>0 </item> <item object_id="_2"> <_x>1 <_y>0.12565 <_z>0.2 </item> <item object_id="_3"> <_x>15 <_y>1.22 <_z>6.6999998 </item> <item object_id="_4"> <_x>1.4299999 <_y>1.55 <_z>2.5 </item> </poly>