Hello,

I'm trying to serialize many boost::shared_ptr to the same object but through different base classes. When I look at the boost::shared_ptr for the base classes they are not properly set. I created a simple example that show my problem. The test program output is:

 

Running 1 test case...

In function ABC

In function A

In function B

In function C

In function ABC

In function A

In function A

In function A

 

I'm using boost 1.33.1 on Linux with gcc 3.4.5 (Red Hat 3.4.5-2).

Thanks for your help,

Michel :)

 

#include <sstream>

#include <iostream>

#include <boost/shared_ptr.hpp>

#include <boost/archive/text_oarchive.hpp>

#include <boost/archive/text_iarchive.hpp>

#include <boost/serialization/serialization.hpp>

#include <boost/serialization/export.hpp>

#include <boost/serialization/shared_ptr.hpp>

#include <boost/test/unit_test.hpp>

#include <boost/test/included/unit_test_framework.hpp>

//----------------------------------------------------------------------------

//

class IA

{

public:

IA() :

a(1)

{

}

virtual ~IA()

{

}

virtual void fctA() = 0;

protected:

int a;

private:

friend class boost::serialization::access;

template<class Archive>

void serialize(Archive& ar, const unsigned int i_version)

{

ar & BOOST_SERIALIZATION_NVP(a);

}

};

BOOST_IS_ABSTRACT(IA)

//----------------------------------------------------------------------------

//

class IB

{

public:

IB() :

b(2)

{

}

virtual ~IB()

{

}

virtual void fctB() = 0;

protected:

int b;

private:

friend class boost::serialization::access;

template<class Archive>

void serialize(Archive& ar, const unsigned int i_version)

{

ar & BOOST_SERIALIZATION_NVP(b);

}

};

BOOST_IS_ABSTRACT(IB)

//----------------------------------------------------------------------------

//

class IC

{

public:

IC() :

c(3)

{

}

virtual ~IC()

{

}

virtual void fctC() = 0;

protected:

int c;

private:

friend class boost::serialization::access;

template<class Archive>

void serialize(Archive& ar, const unsigned int i_version)

{

ar & BOOST_SERIALIZATION_NVP(c);

}

};

BOOST_IS_ABSTRACT(IC)

//----------------------------------------------------------------------------

//

class ABC : public IA, public IB, public IC

{

public:

ABC() :

abc(4)

{

}

virtual void fctABC()

{

std::cout << "In function ABC" << std::endl;

}

virtual void fctA()

{

std::cout << "In function A" << std::endl;

}

virtual void fctB()

{

std::cout << "In function B" << std::endl;

}

virtual void fctC()

{

std::cout << "In function C" << std::endl;

}

protected:

int abc;

private:

friend class boost::serialization::access;

template<class Archive>

void serialize(Archive& ar, const unsigned int i_version)

{

ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(IA);

ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(IB);

ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(IC);

ar & BOOST_SERIALIZATION_NVP(abc);

}

};

BOOST_CLASS_EXPORT(ABC)

BOOST_SERIALIZATION_SHARED_PTR(ABC)

BOOST_SERIALIZATION_SHARED_PTR(IA)

BOOST_SERIALIZATION_SHARED_PTR(IB)

BOOST_SERIALIZATION_SHARED_PTR(IC)

//----------------------------------------------------------------------------

//

class SharedPtrTest

{

public:

void testSharedPtr()

{

std::stringstream w_stream;

{

boost::shared_ptr<ABC> abc(new ABC());

boost::shared_ptr<IA> a(abc);

boost::shared_ptr<IB> b(abc);

boost::shared_ptr<IC> c(abc);

abc->fctABC();

a->fctA();

b->fctB();

c->fctC();

boost::archive::text_oarchive oa(w_stream);

oa << BOOST_SERIALIZATION_NVP(abc);

oa << BOOST_SERIALIZATION_NVP(a);

oa << BOOST_SERIALIZATION_NVP(b);

oa << BOOST_SERIALIZATION_NVP(c);

}

{

boost::shared_ptr<ABC> abc;

boost::shared_ptr<IA> a;

boost::shared_ptr<IB> b;

boost::shared_ptr<IC> c;

boost::archive::text_iarchive ia(w_stream);

ia >> BOOST_SERIALIZATION_NVP(abc);

ia >> BOOST_SERIALIZATION_NVP(a);

ia >> BOOST_SERIALIZATION_NVP(b);

ia >> BOOST_SERIALIZATION_NVP(c);

abc->fctABC();

a->fctA();

b->fctB();

c->fctC();

}

}

};

//----------------------------------------------------------------------------

//

class SharedPtrTestSuite : public boost::unit_test::test_suite

{

public:

SharedPtrTestSuite() :

test_suite("SharedPtr")

{

boost::shared_ptr<SharedPtrTest> w_instance(new SharedPtrTest());

add(BOOST_CLASS_TEST_CASE(&SharedPtrTest::testSharedPtr, w_instance));

}

};

//----------------------------------------------------------------------------

//

boost::unit_test::test_suite* init_unit_test_suite(int, char* [])

{

boost::unit_test::test_suite* test = BOOST_TEST_SUITE("Unit test");

test->add(new SharedPtrTestSuite());

return test;

}



Changez de tête et de tenue tous les jours si vous le voulez ! Volez la vedette sur Yahoo! Québec Avatars