Subject: Re: [Boost-users] Derived class is not serialising/de-serialising...
From: Robert Ramey (ramey_at_[hidden])
Date: 2013-08-06 12:39:28


Marcus MacWilliam wrote:
> Hello,
>
> My previous post contained a minimal example, which was incomplete,
> deliberately so as not to bloat the post with code. However Jeff Flynn
> has requested a minimal code example.
>
> I have attached several files for classes to this e-mail.
>
> BaseClass - the base class, which has a serialize method
> DerivedClass - a sub-class with its own serialize method
> InstantiableClass - the class actually instantiated from DerivedClass
> Main - code example of the client/server that serializes and
> de-serializes the InstantiableClass object.
> Our system automatically inserts some pre-compiled headers so
> to get the code to compile you may need to add your own #includes.
>
> The output from the main program is this:
>
> Serializing...
> BOOST: I am an Instantiable class object
> BOOST: I am in BaseClass::serialize
> De-serializing...
> BOOST: I am an Instantiable class object
> BOOST: I am in BaseClass::serialize
> Assertion failed: dynamic_cast<InstantiableClass&>(object).getCom()
> == 20, file Main.cc, line 8
>
> This highlights the polymorphism problem in a nutshell. The overloaded
> what() method is telling me that in both the client and server code
> the objects is an InstantiableClass object. However the
> Derived::serialize
> is not being called on either side. Thus the data (m_com) from the
> DerivedClass
> is not being serialized and is lost.
>
> The compiler, and debugger, is telling me my object is an
> InstantiableClass,
> however when boost calls serialize on the object, the code in the
> BaseClass
> and not the Derived class is being called.
>
> Any help greatly appreciated.

At first I thought this was obvious. But now I look at this I would have
thought it would work.
I'm thinkinig it's related to the member function look up rules associated
with virtual
member functions. In any case, try the following:

a) in BaseClass.h
what();
to
what() = 0;
This will detect any non-obvious copying (slicing) which might be occurring.

b) in InstantiableClass add a serialize function which only incudes only
base object serialization.

c) tweak your main test program so that it doesn't use InstantiableClass
but rather DerivedClass directly. Does that work?

Robert Ramey