#include #include #include #include #include #include #include struct VBase; struct VBase { virtual ~VBase() {} friend class boost::serialization::access; template void serialize(Archive &/*ar*/, const unsigned int /*version*/) { } }; BOOST_CLASS_TRACKING(VBase, boost::serialization::track_always) struct Mid1 : virtual VBase { friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int /*version*/) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(VBase); } }; struct Mid2 : virtual VBase { friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int /*version*/) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(VBase); } }; struct Sub1 : Mid1, Mid2 { friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int /*version*/) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Mid1); ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Mid2); } }; struct Sub2 : Mid1, Mid2 { friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int /*version*/) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Mid1); ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Mid2); } }; struct Target : Sub2 { friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int /*version*/) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Sub2); } }; #if 0 // OK BOOST_CLASS_EXPORT(Target) BOOST_CLASS_EXPORT(Sub1) #else // NG BOOST_CLASS_EXPORT(Sub1) BOOST_CLASS_EXPORT(Target) #endif int main() { // Serialize pTarget via VBase pointer. { std::ofstream ofs("outtarget.xml"); boost::archive::xml_oarchive oa(ofs); assert(ofs); Target* pTarget = new Target; VBase * pVBase = pTarget; oa << boost::serialization::make_nvp("pVBase", pVBase); } { std::ifstream ifs("outtarget.xml"); assert(ifs); boost::archive::xml_iarchive ia(ifs); VBase * pVBase; ia >> boost::serialization::make_nvp("pVBase", pVBase); } // Serialize pSub1 via VBase pointer. { std::ofstream ofs("outsub1.xml"); boost::archive::xml_oarchive oa(ofs); assert(ofs); Sub1* pSub1 = new Sub1; VBase * pVBase = pSub1; oa << boost::serialization::make_nvp("pVBase", pVBase); } { std::ifstream ifs("outsub1.xml"); assert(ifs); boost::archive::xml_iarchive ia(ifs); VBase * pVBase; ia >> boost::serialization::make_nvp("pVBase", pVBase); } }