测试了下boost的序列化反序列化功能

21 篇文章 1 订阅
// testSerialization.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/vector.hpp>

#include <string>
#include <vector>
#include <iostream>
#include <sstream>  
#include <fstream>

/*
标题:boost的序列化反序列化功能测试
环境:VS2010sp1、boost 1.55
参考资料:
[1]《Boost中支持序列化反序列化的库--boost.serialization 》
http://blog.csdn.net/oracleot/article/details/4280084
[2]《What does BOOST_SERIALIZATION_NVP do when serializing object?》
http://stackoverflow.com/questions/8532331/what-does-boost-serialization-nvp-do-when-serializing-object
*/

struct MyRecord
{
	std::string a;
	std::string b;
	//为使当前的结构能支持序列化,得加入下面的代码段
private:
	friend class boost::serialization::access;
	template<class Archive>
	void serialize(Archive & ar, const unsigned int version)
	{
		ar & a;
		ar & b;
	}
};

struct MyData{
	int id;
	std::string strName;
	std::string strValue;

	MyData() {}
	MyData(int id, std::string strName, std::string strValue)
	{
		this->id = id;
		this->strName = strName;
		this->strValue = strValue;
	}

	std::vector<MyRecord> listMR;

private:
	friend boost::serialization::access;          //声明友元,授予访问权限
	template<typename Archive>
	void serialize(Archive &ar,const unsigned int version)     //序列化函数
	{
		ar & id;
		ar & strName & strValue;
		ar & listMR;
	}
};

void printTest(MyData &mt)
{
	std::cout<<"a="<<mt.id<<" uid="<<mt.strName.c_str()<<" usr="<<mt.strValue.c_str()<<std::endl;

	std::vector<MyRecord>::iterator iter = mt.listMR.begin();
	while(iter!=mt.listMR.end())
	{
		std::cout<<"=> "<<iter->a.c_str()<<"  "<<iter->b.c_str()<<std::endl;
		iter++;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::stringstream ss;

	//序列化
	MyData p1(11,"anderson","neo");      //被序列化的对象
	//为被序列化对象添加两条记录
	MyRecord mr,mr2;
	mr.a="apple",mr.b="第一条记录";
	mr2.a = "this is b",mr2.b = "第二条记录";
	p1.listMR.push_back(mr);
	p1.listMR.push_back(mr2);

	boost::archive::text_oarchive(ss) << p1; //序列化
	//序列化为xml形式要求中文为utf-8编码,否则打开文件是乱码
	//std::stringstream ss;
	//std::ofstream ofs("d:\\a.xml");
	//boost::archive::xml_oarchive oa(ofs);
	//oa << BOOST_SERIALIZATION_NVP(p1);


	//反序列化
	MyData p2;                               //被反序列化的对象
	boost::archive::text_iarchive(ss) >> p2; //反序列化

	printTest(p2);
	std::cout << "序列化后的=>" <<	ss.str() << std::endl;;

	return 0;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值