#include #include #include #include #include #include #include // no need to include #include // no need to include #include // explicit code for exports (place last) class RepeatBase { public: RepeatBase() {} virtual ~RepeatBase() {} virtual const std::string& name() const = 0; private: friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) {} }; class RepeatDerived : public RepeatBase { public: RepeatDerived( const std::string& name) : name_(name) {} RepeatDerived() {} virtual const std::string& name() const { return name_;} private: std::string name_; friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int version) { // save/load base class information ar & boost::serialization::base_object(*this); ar & name_; } }; class Defs { public: Defs(const std::string& f) : fileName_(f), repeat_(new RepeatDerived(f)) {} Defs() : repeat_(NULL) {} ~Defs() { delete repeat_;} bool operator==(const Defs& rhs) const { return fileName_ == rhs.fileName_;} const std::string& fileName() { return fileName_;} private: std::string fileName_; RepeatBase* repeat_; friend class boost::serialization::access; template void serialize(Archive & ar, const unsigned int /*version*/) { ar & fileName_; ar & repeat_; } }; BOOST_CLASS_EXPORT(RepeatDerived); BOOST_SERIALIZATION_ASSUME_ABSTRACT(RepeatBase) int main() { Defs saveDefs("saveFile.txt"); { // Save the defs file std::ofstream ofs( saveDefs.fileName().c_str() ); boost::archive::text_oarchive oa( ofs ); oa << saveDefs; } { // Restore the defs file Defs loadDefs; std::ifstream ifs(saveDefs.fileName().c_str()); boost::archive::text_iarchive ia(ifs); ia >> loadDefs; assert( saveDefs == loadDefs ); } return 0; }