#include #include #include class base { public: virtual ~base() {} private: friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int version) { } }; class wrapper { protected: class derived : public base { private: friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int version) { boost::serialization::base_object(*this); } }; public: wrapper() : b(new derived()) {} private: base *b; friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int version) { ar & b; } // uncommenting this line and the line below appear to work, so i'll write a macro for those. //static ::boost::archive::detail::guid_initializer< wrapper::derived > const & guid_initializer; }; //::boost::archive::detail::guid_initializer< wrapper::derived > const & wrapper::guid_initializer = ::boost::serialization::singleton< ::boost::archive::detail::guid_initializer< wrapper::derived > >::get_mutable_instance().export_guid("derived"); BOOST_CLASS_EXPORT_GUID(wrapper::derived, "wrapper::derived"); main() { std::ofstream s("/tmp/foo.out"); boost::archive::binary_oarchive a(s); wrapper o = wrapper(); a & o; }