#include #include #include #include #include #include #include #include class A { public: int a; A() { a = -1; } virtual ~A() { } virtual void printInfo() const { std::cout << "A{a = " << a << "}"; } template void serialize(Archive & ar, const unsigned int version) { ar & a; } }; class B : public A { public: float b; B() { b = -2.0; } void printInfo() const { std::cout << "B{base = "; A::printInfo(); std::cout << ", b = " << b << "}"; } template void serialize(Archive & ar, const unsigned int version) { ar & boost::serialization::base_object(*this); ar & b; } }; class C : public A { }; int main() { using namespace std; cout << "Start boost-serialization test\n\n"; boost::shared_ptr p1( new B ); boost::shared_ptr p2; ostringstream os(ios_base::out|ios_base::binary); { boost::archive::binary_oarchive oar(os); // this order is OK /* oar.register_type((B*)0); oar.register_type((C*)0); */ // this order causes segmentation fault oar.register_type((C*)0); oar.register_type((B*)0); oar & p1; } const string data(os.str()); cout << "Serialization done, data size [bytes]: " << data.size() << endl; istringstream is(data, ios_base::in|ios_base::binary); { boost::archive::binary_iarchive iar(is); iar.register_type((B*)0); iar & p2; } cout << "Deserialization done\n"; return 0; }