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>