C++:序列化和反序列化知识和代码

转载:

1.c++ 序列化和反序列化 - Malphite - 博客园 (cnblogs.com)

2. C++使用boost.serialization序列化与反序列化_c++ boost 序列化_mq白的博客-CSDN博客

3.xml、json、protobuf序列化协议 - 知乎 (zhihu.com)

4.Boost序列化全解析_boost 序列化_土豆西瓜大芝麻的博客-CSDN博客  

重点:

1.序列化和反序列化的方法有4种:

(1)Google Protocol Buffers (GPB)是Google内部使用的数据编码方式,旨在用来取代XML进行数据交换。可用于数据序列化与反序列化。

(2)Boost.Serialization能够创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者实用户自己定义的其它文件。

(3)Windows平台下可使用MFC中的序列化方法。MFC 对 CObject 类中的序列化提供内置支持。

(4).NET的执行时环境用来支持用户定义类型的流化的机制。它在此过程中,先将对象的公共字段和私有字段以及类的名称(包含类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象全然同样的副本。

2.其中GPB和Boost.Serialization是最主流。

3.主流的序列化协议包括:​xml、json、protobuf。而protobuf速度最快

查看boostv1.59的版本,则存在

basic_binary、basic_text、basic_xml、binary_oarchive、polymorphic_iarchive、text_iarchive、xml_iarchive这几种。最新boost应该包含更多

C++:序列化和反序列化知识和代码_第1张图片

 C++:序列化和反序列化知识和代码_第2张图片

 

采用Boost.Serialization进行txt序列化代码(侵入式和非侵入式),选择的时候看情况选用

#include 
#include 
#include 
#include 
#include 
#include 

class A
{
public:
	A(int aa, double bb) :a(aa), b(bb) {}
	A() {}
	void print() { std::cout << a << ' ' << b << std::endl; }

private:
	// 为了能让串行化类库能够访问私有成员,所以要声明一个友元类
	friend class boost::serialization::access;
	// 串行化的函数,这一个函数完成对象的保存与恢复,这是侵入式的方法序列化,要更改类的代码
	template
	void serialize(Archive& ar, const unsigned int version)
	{
		ar& a;   //就是这么简单,也可以使用 ar<
	void serialize(Archive& ar, const unsigned int version)
	{
		ar& boost::serialization::base_object(*this); // 注意这里
		ar& c;
	}

	char c;
};

void A_test()
{
	std::ofstream fout("file.txt");// 把对象写到file.txt文件中
	boost::archive::text_oarchive oa(fout); // 文本的输出归档类,使用一个ostream来构造
	A obj(1, 2.5);
	oa << obj; // 保存obj对象
	fout.close();// 关闭文件

	std::ifstream fin("file.txt");
	boost::archive::text_iarchive ia(fin); // 文本的输入归档类
	A newobj;
	ia >> newobj; // 恢复到newobj对象
	newobj.print();
	fin.close();
}

//和A的反序列化方式没有任何区别
void B_test() 
{
	std::ofstream fout("file.txt");
	boost::archive::text_oarchive oa(fout);
	B obj(97);
	oa << obj;
	fout.close();

	std::ifstream fin("file.txt");
	boost::archive::text_iarchive ia(fin);
	B newobj;
	ia >> newobj;
	newobj.print();
	newobj.A::print();//访问父类
	fin.close();
}

int main() {
	A_test();//侵入式序列化和反序列化
	//B_test();//侵入式序列化子类和反序列化
}

非侵入式(把数据暴露出来)

#include
#include 
#include 
#include 
#include
#include 

class A
{
public:
	A() :_tag(0), _text("") {}

	A(int tag, std::string text) :_tag(tag), _text(text) {}

	void print() {
		std::cout << _tag << ' ' << _text << '\n';
	}

	int _tag;
	std::string _text;
	
};

namespace boost {
	namespace serialization {
		template
		void serialize(Archive& ar, A& d, const unsigned int version)
		{
			ar& d._tag;
			ar& d._text;
		}
	} // namespace serialization
} // namespace boost

int main() {
	std::ofstream fout("file.txt");// 把对象写到file.txt文件中
	boost::archive::text_oarchive oa(fout); // 文本的输出归档类,使用一个ostream来构造
	A obj(10, "**");
	oa << obj; // 保存obj对象
	fout.close();// 关闭文件

	std::ifstream fin("file.txt");
	boost::archive::text_iarchive ia(fin); // 文本的输入归档类
	A newobj;
	ia >> newobj; // 恢复到newobj对象
	newobj.print();
	fin.close();
}

你可能感兴趣的:(C++经验,c++)