boost::serialization(2)序列化基类

在派生类中序列化一个基类

假如有一个基类如下:

class student_info
{
public:
	student_info() {}
	virtual ~student_info() {}
	student_info(const std::string& sn, const std::string& snm, const std::string& sg)
		: name_(sn), number_(snm), grade_(sg)
	{
	}

	virtual void print_info() const
	{
		std::cout << name_ << " " << number_ << " " << grade_ << std::endl;
	}

private:
	std::string name_;
	std::string number_;
	std::string grade_;
};

它的一个派生类如下:

class middle_student : public student_info
{
public:
	middle_student() {}
	virtual ~middle_student() {}
	middle_student(const std::string& sn, const std::string& snm, const std::string& sg, int age)
		: student_info(sn, snm, sg), age_(age)
	{

	}

	virtual void print_info()
	{
		student_info::print_info();
		std::cout << age_ << std::endl;
	}
private:
	int age_;
};

我们如何在序列化派生类的同时序列化基类?

boost::serialization提供一个base_object的模板发现来

解决这个问题,我们只需要在派生类的序列化代码中使用这个方法即可。

代码如下:

private:
	friend class boost::serialization::access;
	template<typename Archive>
	void serialize(Archive& ar, const unsigned int version)
	{
		ar & boost::serialization::base_object<student_info>(*this);//使用基类的序列化
		ar & BOOST_SERIALIZATION_NVP(age_);
	}

记住需要包含头文件 <boost/serialization/base_object.hpp>,这样就解决问题了

完整代码如下:

class student_info
{
public:
	student_info() {}
	virtual ~student_info() {}
	student_info(const std::string& sn, const std::string& snm, const std::string& sg)
		: name_(sn), number_(snm), grade_(sg)
	{
	}

	virtual void print_info() const
	{
		std::cout << name_ << " " << number_ << " " << grade_ << std::endl;
	}

private:
	friend class boost::serialization::access;
	template<typename Archive>
	void serialize(Archive& ar, const unsigned int version)
	{
		ar & BOOST_SERIALIZATION_NVP(name_);
		ar & BOOST_SERIALIZATION_NVP(number_);
		ar & BOOST_SERIALIZATION_NVP(grade_);
	}

private:
	std::string name_;
	std::string number_;
	std::string grade_;
};

class middle_student : public student_info
{
public:
	middle_student() {}
	virtual ~middle_student() {}
	middle_student(const std::string& sn, const std::string& snm, const std::string& sg, int age)
		: student_info(sn, snm, sg), age_(age)
	{

	}

	virtual void print_info()
	{
		student_info::print_info();
		std::cout << age_ << std::endl;
	}

private:
	friend class boost::serialization::access;
	template<typename Archive>
	void serialize(Archive& ar, const unsigned int version)
	{
		ar & boost::serialization::base_object<student_info>(*this);
		ar & BOOST_SERIALIZATION_NVP(age_);
	}

private:
	int age_;
};

boost::serialization(2)序列化基类,布布扣,bubuko.com

时间: 2024-10-29 19:10:10

boost::serialization(2)序列化基类的相关文章

怎样用boost::serialization去序列化派生模板类

本篇是boost::serialization 用基类指针转存派生类(错误多多,一波三折)的姊妹篇,这里只不过做一个总结. 先来看一个基类 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... }; 它的一个模板

如何用boost::serialization去序列化派生模板类(续)

在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. 先看看变异错误的代码(...看不出有错,但是编译就有错). 基类代码: class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_da

怎样用boost::serialization去序列化派生模板类(续)

在 怎样用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写测试用例时一直出现编译错误,调了很久也没跳出来,今天偶然试了一下...居然调了出来. 先看看变异错误的代码(...看不出有错,可是编译就有错). 基类代码: class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_dat

boost::serialization 用基类指针转存派生类(错误多多,一波三折)

boost::serialization 也支持c++的多态,这样我们就可以通过使用基类的指针来转存派生类, 我们接着上一篇( boost::serialization(2)序列化基类 )的例子来看: 基类和派生类的代码如下: class student_info { public: student_info() {} virtual ~student_info() {} student_info(const std::string& sn, const std::string& snm,

boost::serialization 拆分serialize函数

在前篇 boost::serialization 用基类指针转存派生类(错误多多,一波三折)文中我们都是使用serialize函数来实现序列化,其代码格式如下: private: friend class boost::serialization::access; template<typename Archive> void serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATIO

畅游C++ Boost Serialization 序列化

畅游C++ Boost Serialization 序列化 1.C++ Boost::serialization简介 2.工作环境 3.使用方法 3.1第一个简单的例子 -- Hello World ,将字符串内容归档到文本文件中 #include <iostream> #include <fstream> #include <string> #include <cstdio> #include <boost/archive/text_oarchive

最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

导读 1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯.这个将 程序数据转化成能被存储并传输的格式的过程被称为"序列化"(Serialization),而它的逆过程则可被称为"反序列化" (Deserialization). 简单

对象序列化之Boost.Serialization

最近在写基于海量点云数据建模程序时,碰到一个效率问题:整个建模过程是管道线方式,这里简单地看作是两步,第一步就是生成所需的数据,第二步即是基于这些生成的数据建模:目前所做的工作就是写第二步,第一步的操作不需要变动,这就造成每次对第二步进行修改(再编译链接后执行)后,重新生成所需数据,而这个生成过程是相当缓慢的,从而给开发调试阶段造成极大的时间浪费. 于是就想到了对象序列化,而对象序列化有好几种方案,常用的有Google Protocol Buffers(protobuf).Boost.Seria

最经常使用的两种C++序列化方案的使用心得(protobuf和boost serialization)

导读 1. 什么是序列化? 2. 为什么要序列化?优点在哪里? 3. C++对象序列化的四种方法 4. 最经常使用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序猿在编写应用程序的时候往往须要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的还有一台计算机上以实现通讯.这个将程序数据转化成能被存储并传输的格式的过程被称为"序列化"(Serialization),而它的逆过程则可被称为"反序列化"(Deserialization). 简