به صورت زیر عمل کنید:
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <fstream>
using namespace boost::archive;
class base_class
{
public:
base_class(int m = 0) : base_member_(0) {}
virtual ~base_class() {}
virtual void print_data() = 0;
protected:
int base_member_;
private:
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
ar & BOOST_SERIALIZATION_NVP(base_member_);
}
};
template<typename T>
class divided_class : public base_class
{
public:
divided_class(int m = 0, T d = T()) : base_class(m), diveded_member_(d) {}
virtual ~divided_class() {}
virtual void print_data(){
cout << diveded_member_;
}
protected:
T diveded_member_;
private:
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);//This place is the direct use of AR & boost:: serialization:: base_object<base_class> (*this) will be wrong
ar & BOOST_SERIALIZATION_NVP(diveded_member_);
//ar & BOOST_SERIALIZATION_NVP(other member...);
}
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT(base_class);
void save()
{
std::ofstream ofs("d:\\t8.xml");
boost::archive::xml_oarchive oa(ofs);
base_class* int_base = new divided_class<int>(1, 3);
base_class* str_base = new divided_class<std::string>(1, "wyp");
base_class* float_base = new divided_class<float>(1, 3.1415926f);
oa.template register_type<divided_class<int>>(NULL);
oa.template register_type<divided_class<std::string>>(NULL);
oa.template register_type<divided_class<float>>(NULL);
oa & BOOST_SERIALIZATION_NVP(int_base);
oa & BOOST_SERIALIZATION_NVP(str_base);
oa & BOOST_SERIALIZATION_NVP(float_base);
}
void load()
{
std::ifstream ifs("d:\\t8.xml");
boost::archive::xml_iarchive ia(ifs);
base_class* int_base;
base_class* str_base;
base_class* float_base;
ia.template register_type<divided_class<int>>(NULL);
ia.template register_type<divided_class<std::string>>(NULL);
ia.template register_type<divided_class<float>>(NULL);
ia & BOOST_SERIALIZATION_NVP(int_base);
ia & BOOST_SERIALIZATION_NVP(str_base);
ia & BOOST_SERIALIZATION_NVP(float_base);
int_base->print_data(); std::cout << std::endl;
str_base->print_data(); std::cout << std::endl;
float_base->print_data(); std::cout << std::endl;
}
int main()
{
save();
load();
}