怎样用boost::serialization去序列化派生模板类
2014-05-03 17:30
591 查看
本篇是boost::serialization 用基类指针转存派生类(错误多多,一波三折)的姊妹篇,这里只不过做一个总结。
先来看一个基类
1.首先我们用一个宏来告诉boost base_class是一个抽象类:
基类的序列化函数:
模板派生类的序列化函数为:
先来看一个基类
class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_data() = 0; protected: int base_member_; //other 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() {} protected: T diveded_member_; //other member.... };现在我们来看怎样用boost::serialization来序列化模板类
1.首先我们用一个宏来告诉boost base_class是一个抽象类:
BOOST_SERIALIZATION_ASSUME_ABSTRACT(base_class);2.分别在基类和派生了中定义序列化函数
基类的序列化函数:
private: class boost::serialization::access; template<typename Archive> void serialize(Archive & ar, const unsigned int file_version) { ar & BOOST_SERIALIZATION_NVP(base_member_); //ar & BOOST_SERIALIZATION_NVP(other member...); }这个序列化函数为什么是私有的,请自己看boost文档
模板派生类的序列化函数为:
private: class boost::serialization::access; template<typename Archive> void serialize(Archive & ar, const unsigned int file_version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);//这个地方直接用ar & boost::serialization::base_object<base_class>(*this)会出错 ar & BOOST_SERIALIZATION_NVP(diveded_member_); //ar & BOOST_SERIALIZATION_NVP(other member...); }3.在save中注册派生模板类
void save() { std::ofstream ofs("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); //Now the tricky point is to register class in serialize 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); //begin serialize oa & BOOST_SERIALIZATION_NVP(int_base); oa & BOOST_SERIALIZATION_NVP(str_base); oa & BOOST_SERIALIZATION_NVP(float_base); }4.在load中同样也要注册派生模板类,而且要和save中注册的一样
void load() { std::ifstream ifs("t8.xml"); boost::archive::xml_iarchive ia(ifs); base_class* int_base; base_class* str_base; base_class* float_base; //Now the tricky point is to register class in serialize 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); //begin serialize ia & BOOST_SERIALIZATION_NVP(int_base); ia & BOOST_SERIALIZATION_NVP(str_base); ia & BOOST_SERIALIZATION_NVP(float_base); //do something... int_base->print_data();std::cout << std::endl; str_base->print_data();std::cout << std::endl; float_base->print_data();std::cout << std::endl; }基本上就这几步!!!!
相关文章推荐
- 怎样用boost::serialization去序列化派生模板类(续)
- 如何用boost::serialization去序列化派生模板类(续)
- boost::serialization 多态(polymorphic)序列化技巧及分析
- Boost - 序列化 (Serialization)
- Boost - 序列化 (Serialization) (写得很好**)
- boost.serialization中基类指针容器存子类对象的序列化
- Boost - 序列化 (Serialization)
- 【boost】使用serialization库序列化子类
- 利用boost的serialization库实现c++对象的序列化与反序列化
- boost序列化(Serialization)
- boost::serialization学习笔记-----类成员序列化
- 轻量级序列化库boost serialization
- 解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System.DelegateSerializationHolder)在此安全级别上被反序列化”错误的办法。
- 对象序列化之Boost.Serialization
- C++Boost序列化(Serialization)库教程
- 轻量级序列化库boost serialization
- Boost.Serialization可动态配置序列化
- boost::serialization(2)序列化基类
- boost--序列化库serialization
- 怎样做才能让Java 序列化机制 更安全 ? Security principles we follow to make Java Serialization safe.