Re: [Boost-users] [serialization] Serialization through pointer to baseclass
Hey Ruediger, you simply need to make toString() virtual :-) Life can be that simple sometimes... Best wishes, DI Christian Pfligersdorffer Software Engineering EOS GmbH
-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org]On Behalf Of Ruediger Berlich Sent: Wednesday, April 04, 2007 5:28 PM To: boost-users@lists.boost.org Subject: [Boost-users] [serialization] Serialization through pointer to baseclass
Hi there, I am trying to serialize an object through a pointer to its base class.
My application is in the field of distributed processing. I have a "communicator" type of class, which receives pointers from other objects, serializes them, sends the generated string over a network for further, remote processing and then deals with the responses. It is supposed to know nothing about the objects it serializes, except that they contain a method "toString()", which is contained in the base class.
However, when I call that method, I only get a serialization of that base class, not of the derived class.
Here is some code to illustrate the problem. The output of the program is listed at the end of this posting.
How can I achieve serialization of the derived class (without explicit casting), if it is stored in a pointer to a base class ?
My assumption is that this has to do with the fact that the "serialization" method cannot be virtual, as it is a member function template.
Any help is appreciated.
Thanks and have a good day, Ruediger
/************************************************************* ************/ // headers and namespace statements removed ...
class base :public vector<int> { friend class boost::serialization::access;
template<class Archive> void serialize(Archive & ar, const unsigned int version){ using boost::serialization::make_nvp; ar & make_nvp("vector",
boost::serialization::base_object<std::vector<int> >(*this)); }
public: base(){ /* nothing */ } virtual ~base() { /* nothing */ }
virtual void appendValue(int val) = 0;
string toString(void){ ostringstream ofs; boost::archive::xml_oarchive oa(ofs); // this should point to derived objects oa << make_nvp("myp",*this); return ofs.str(); }
void printType(void){ cout << typeid(*this).name() << endl; } };
BOOST_IS_ABSTRACT(base);
/************************************************************* ***************/
class derived :public base { friend class boost::serialization::access;
template<class Archive> void serialize(Archive & ar, const unsigned int version){ using boost::serialization::make_nvp; ar & make_nvp("base", boost::serialization::base_object<base>(*this)); }
public: derived(){ /* nothing */ } virtual ~derived() { /* nothing */ }
void appendValue(int val){ this->push_back(val); } };
BOOST_CLASS_EXPORT(derived);
/************************************************************* ***************/
main() { base *myp = new derived(); myp->appendValue(1);
// only serializes class "base" cout << myp->toString();
cout << "===========================" << endl;
myp->printType(); // this in printType points to the correct type cout << "===========================" << endl;
// Explicit casting to the derived class yields the correct response derived *mypp = (derived *)myp; ostringstream ofs; boost::archive::xml_oarchive oa(ofs); oa << make_nvp("myp",*mypp); cout << ofs.str() << endl; }
/************************************************************* ***************/
Here is the output of the program:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!DOCTYPE boost_serialization> <boost_serialization signature="serialization::archive" version="3"> <myp class_id="0" tracking_level="0" version="0"> <vector> <count>1</count> <item>1</item> </vector> </myp> =========================== 7derived =========================== <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <!DOCTYPE boost_serialization> <boost_serialization signature="serialization::archive" version="3"> <myp class_id="0" tracking_level="1" version="0" object_id="_0"> <base class_id="1" tracking_level="0" version="0"> <vector> <count>1</count> <item>1</item> </vector> </base> </myp>
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (1)
-
Pfligersdorffer, Christian