Boost logo

Boost Users :

Subject: Re: [Boost-users] [serialization] Serializing derived template classvia base pointer
From: Tim Moore (tim_at_[hidden])
Date: 2013-01-17 17:29:19


On 2013-01-17 16:35, Daniel Mitchell wrote:
> Hi Robert, thanks for your reply. Unfortunately I couldn't find any
> of the demos to which you refer, but I did find a 2005 boost-users
> thread on the subject:
>
> http://thread.gmane.org/gmane.comp.lib.boost.user/13244/
>
> In that discussion you said you did not have a general solution. I'm
> just wondering if anything has changed since then e.g maybe C++11
> makes a solution possible.
>
> On Jan 17, 2013, at 2:01 PM, "Robert Ramey" <ramey_at_[hidden]> wrote:
>
>> Daniel Mitchell wrote:
>>> Hi everyone, has any progress has been made on a general solution
>>> for
>>> this problem? Given classes like these,
>>>
>>> struct base {
>>> template<typename Archive>
>>> void serialize(Archive& ar, unsigned version) { }
>>> virtual ~base() = default;
>>> };
>>>
>>> template<typename T>
>>> struct derived : base {
>>> template<typename Archive>
>>> void serialize(Archive& ar, unsigned version) { ar & data; }
>>> T data;
>>> };
>>>
>>> is it possible to serialize the derived type (with T unknown) via a
>>> base pointer? Sticking a call to register_type<derived> in
>>> derived::serialize doesn't seem to do it.
>>
>> There are several demos in the examples directory which show how to
>> do this.
>>
>> Robert Ramey
>>

I don't totally understand your original issue, but does this possibly
do what you are wanting ??

#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/export.hpp>

struct base {
   template<typename Archive>
   void serialize(Archive& ar, unsigned version) { }

   virtual ~base() { }
};

BOOST_CLASS_EXPORT_KEY(base);
BOOST_CLASS_EXPORT_IMPLEMENT(base);

template<typename T>
struct derived : base {
   derived() { }
   derived(int v) : data(v) { }

   template<typename Archive>
   void serialize(Archive& ar, unsigned version) {
     ar & boost::serialization::base_object<base>(*this);
     ar & data;
   }

   T data;
};

BOOST_CLASS_EXPORT_KEY(derived<int>);
BOOST_CLASS_EXPORT_IMPLEMENT(derived<int>);

int main() {
   base* b = new derived<int>(99);
   std::ofstream o("test.out", std::ios::binary);
   if (o.good()) {
     boost::archive::binary_oarchive oa(o);
     oa & b;
   }
   o.close();
   delete b;

   std::ifstream i("test.out", std::ios::binary);
   if (i.good()) {
     base* b;
     boost::archive::binary_iarchive ia(i);
     ia & b;
     std::cout << static_cast<derived<int>*>(b)->data << std::endl;
   }
   i.close();
}


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