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);
};