سریالایز کردن توسط boost به صورت xml - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

سریالایز کردن توسط boost به صورت xml

0 امتیاز
برای سریالایز کردن کلاس مشتق شده از کلاس پایه چطور می تونم از boost استفاده کنیم در ضمن کلاس های مشتق شده من generic هستند و باید تو فایل xml ذخیره کنمش
سوال شده شهریور 15, 1394  بوسیله ی korosh (امتیاز 155)   12 32 37
دوباره باز شد اردیبهشت 8, 1396 بوسیله ی مصطفی ساتکی

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

به صورت زیر عمل کنید:

#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();

}

 

پاسخ داده شده شهریور 19, 1394 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
انتخاب شد اردیبهشت 13, 1396 بوسیله ی korosh
...