#include #include #include #include #include #include using namespace boost; using namespace std; //#define THRUBASE //To perform the serialization through a base class pointer #undef THRUBASE //To perform the serialization through a derived class instance #define INCL_SERIALIZE //#define BASE2ACCESS public #define BASE2ACCESS protected //#define BASE2ACCESS private class Base1{ friend class boost::serialization::access; public: Base1():foo1(1){}; virtual void print(){ cout << "Base:" << foo1 << endl;} protected: int foo1; private: #ifdef INCL_SERIALIZE template void serialize(Archive & ar, const unsigned int version){ ar & foo1; } #endif }; #ifdef INCL_SERIALIZE BOOST_CLASS_EXPORT_GUID(Base1,"bugtry.Base1") #endif class Base2{ friend class boost::serialization::access; public: Base2():foo2(2){}; virtual void print(){ cout << "Base:" << foo2 << endl;} protected: int foo2; private: #ifdef INCL_SERIALIZE template void serialize(Archive & ar, const unsigned int version){ ar & foo2; } #endif }; #ifdef INCL_SERIALIZE BOOST_CLASS_EXPORT_GUID(Base2,"bugtry.Base2") #endif class Derived:public Base1, BASE2ACCESS Base2{ friend class boost::serialization::access; public: Derived():bar(3){}; virtual void print(){ cout << "Derived:" << foo1 << "," << foo2 << "," << bar << endl;} private: int bar; #ifdef INCL_SERIALIZE template void serialize(Archive & ar, const unsigned int version){ ar & boost::serialization::base_object(*this); ar & boost::serialization::base_object(*this); ar & bar; } #endif }; #ifdef INCL_SERIALIZE BOOST_CLASS_EXPORT_GUID(Derived,"bugtry.Derived") #endif int main(int argc,char **argv) { Derived d; Base1* b = &d; b->print(); #ifdef INCL_SERIALIZE ofstream o("bugtry.out"); boost::archive::text_oarchive out(o); #ifdef THRUBASE out << b; #else // out << d; #endif #endif return 0; }