#include #include #include #include #include #include #include #include #include #include #include struct Base1 { virtual ~Base1() {} // serialize friend class boost::serialization::access; template void serialize(Archive & /*ar*/, const unsigned int /* file_version */) {} }; struct Base2 { virtual ~Base2() {} // serialize friend class boost::serialization::access; template void serialize(Archive & /*ar*/, const unsigned int /* file_version */) {} }; struct Sub:public Base1, public Base2 { virtual ~Sub() {} boost::weak_ptr wp_; // serialize friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int /* file_version */) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base1); ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base2); ar & BOOST_SERIALIZATION_NVP(wp_); // *1 } }; BOOST_CLASS_EXPORT(Sub) int main() { { // serialize boost::shared_ptr s(new Sub); boost::shared_ptr pb2(s); s->wp_ = s; // set weak_ptr. If not set, deserialize success. std::ofstream ofs("output.xml"); assert(ofs); boost::archive::xml_oarchive oa(ofs); oa << boost::serialization::make_nvp("Base2", pb2); } { // de-serialize std::ifstream ifs("output.xml"); assert(ifs); boost::archive::xml_iarchive ia(ifs); boost::shared_ptr pb2; ia >> boost::serialization::make_nvp("Base2", pb2); // check // pb2's vptr is broken. assert(dynamic_cast(pb2.get())); } }