Boost logo

Boost Users :

From: Sergey Filippov (Sergey.Filippov_at_[hidden])
Date: 2005-09-26 06:36:07


Hi, all.
 
I'm using boost 1.33.0 and I have a problem deserializing from an
archive (I'm using VC 7.1). To reproduce the problem I wrote a sample
program listed below.

#include <sstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/export.hpp>
#include <boost/serialization/vector.hpp>

struct A
{
    virtual ~A() {}

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

struct B: A
{
    friend class boost::serialization::access;
    template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
    {
        ar & boost::serialization::base_object<A>(*this);
    }
};

BOOST_CLASS_EXPORT(A);
BOOST_CLASS_EXPORT(B);

int main(int argc, char* argv[])
{
    std::string str;

    {
        std::stringstream stream;
        boost::archive::binary_oarchive ar(stream);
        B b;
        std::vector<int> v(10);

        ar & b;
        ar & v;

        str = stream.rdbuf()->str();
    }

    {
        std::stringstream stream;

        stream.rdbuf()->str(str);

        boost::archive::binary_iarchive ar(stream);
        B b;
        std::vector<int> v;

        ar & b;
        ar & v; // causes an assert
    }

    return 0;
}

During deserialization of the vector (a line with "// causes an
assert"), an assert occurs in the line 266 in basic_iarchive.cpp.

I don't understand the library source code well, but it looks something
strange for me. As far as I understood the reset_object_address function
supposed to be called with addresses of tracked objects. In my case the
new_address parameter is the address of an element in the vector. But
the vector elements are of a primitive type and must not be tracked.
Maybe reset_object_address supposed to handle such a situation, but in
the provided sample something goes wrong.

If I skip the line with reset_object_address in archive_input_seq
(collections_load_impl.hpp, line 91) in debugger, the sample works as
expected. Also with 1.32 (in which archive_input_seq almost identical
with one in 1.33 except the call to reset_object_address) the sample
works as well. So I'm considering to patch the library by commenting
this line. What side effects will it have?
I as understood from previous posts in this forum reset_object_address
was added as a bugfix to loading of containers with pointers to
trackable objects. Is it safe to comment out the reset_object_address
call, if I do not serialize such containers?

Or maybe I'm just using the serialization library in a wrong way? Then
where is the problem in my code?

Thanks in advance.

Sergey


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