转载:
1.c++ 序列化和反序列化 - Malphite - 博客园 (cnblogs.com)
2. C++使用boost.serialization序列化与反序列化_c++ boost 序列化_mq白的博客-****博客
3.xml、json、protobuf序列化协议 - 知乎 (zhihu.com)
4.Boost序列化全解析_boost 序列化_土豆西瓜大芝麻的博客-****博客
重点:
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应该包含更多
采用Boost.Serialization进行txt序列化代码(侵入式和非侵入式),选择的时候看情况选用
#include <iostream>
#include <fstream>
#include <iostream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/base_object.hpp>
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<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar& a; //就是这么简单,也可以使用 ar<<a 这样的语法
ar& b;
}
// 对象的数据
int a;
double b;
};
class B :public A//序列化一个子类
{
public:
B(char v ) :c(v) {}
B() {};
void print() {std::cout << c << '\n';}
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar& boost::serialization::base_object<A>(*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<iostream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include<boost/serialization/base_object.hpp>
#include <boost/multiprecision/cpp_int.hpp>
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<class Archive>
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();
}