|
Boost Users : |
Subject: [Boost-users] [Serialization] Deserialization of base class fails
From: Torsten Wylegala (torstenwylegala_at_[hidden])
Date: 2014-10-25 11:09:09
Hi,
I'm currently trying to serialize and deserialize a derived class using
boost::archive::xml_iarchive/xml_oarchive Version 1.52.
Everything works fine as long as I serialize and deserialize the same
class (Example 1). The attributes of the derived class and the base
class are both serialized and the deserialized correctly and
requestPackageOut equals requestPackageIn (the base-class attributes are
equal too). But if I serialize the derived class "RequestPackage" and
try to deserialize it into the base-class "Package" (Example 2) I'm
getting an "input stream error" exception while trying to deserialize
with ia >> BOOST_SERIALIZATION_NVP(*package);.
I'm quite new to this topic and found a lot of posting but none of them
seems to match and solve my exact problem. It would by very nice if
somebody could help me with that.
Background information: I want to use xml-serialized objects for data
exchange via network and want all the packages to inherit from
Package-class which carries "packageId" and therefore give me the chance
to identify the incoming xml-objects and handle every package based on
this id.
If some information is missing I will do my best to provide it later.
Torsten
Example 1:
int main(int argc, char** argv){
std::cout << "Started!" << std::endl;
std::string serializedObject;
RequestPackage requestPackageOut;
RequestPackage requestPackageIn;
requestPackageOut.setPackageId(3);
requestPackageIn.setPackageId(0);
Serializer::serialize(&serializedObject,&requestPackageOut);
Serializer::deserialize(&serializedObject,&requestPackageIn);
return 0;
}
Example 2:
int main(int argc, char** argv){
std::cout << "Started!" << std::endl;
std::string serializedObject;
Package package;
RequestPackage requestPackageOut;
RequestPackage requestPackageIn;
requestPackageOut.setPackageId(3);
requestPackageIn.setPackageId(0);
Serializer::serialize(&serializedObject,&requestPackageOut);
Serializer::deserialize(&serializedObject,&package);
return 0;
}
The Rest:
namespace Serializer{
template <typename T> int serialize(std::string *serializedObject,
T *package){
int returnValue = 0;
std::ostringstream objectOss;
boost::archive::xml_oarchive oa(objectOss);
try {
oa << BOOST_SERIALIZATION_NVP(package);
} catch (boost::archive::archive_exception const& ex) {
returnValue = 1;
}
serializedObject->assign(objectOss.str());
return returnValue;
};
template <typename T> int deserialize(std::string *serializedObject, T
*package){
int returnValue = 0;
std::istringstream objectIss(*serializedObject);
boost::archive::xml_iarchive ia(objectIss);
try {
ia >> BOOST_SERIALIZATION_NVP(*package);
} catch (boost::archive::archive_exception const& ex) {
std::cerr << "Error: " << ex.what() << std::endl;
std::cerr.flush();
returnValue = 1;
}
return returnValue;
};
}
class RequestPackage : public Package{
private:
friend class boost::serialization::access;
template<class Archive> void serialize(Archive & ar,
const unsigned int version) {
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Package);
ar & BOOST_SERIALIZATION_NVP(requestId);
}
int requestId;
public:
int getRequestId() const;
void setRequestId(int requestId);
};
class Package{
private:
friend class boost::serialization::access;
template<class Archive> void serialize(Archive & ar,
const unsigned int version) {
ar & BOOST_SERIALIZATION_NVP(packageID);
}
int packageID;
public:
int getPackageId() const;
void setPackageId(int packageId);
};
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