C++中的序列化和反系列化
Posted 星火撩猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中的序列化和反系列化相关的知识,希望对你有一定的参考价值。
概念
序列化,就是把内存里“活的对象”转换成静止的字节序列,便于存储和网络传输;而反序列化则是反向操作,从静止的字节序列重新构建出内存里可用的对象。
代码示例1
json库(纯文本形式)
#include <iostream>
#include <cassert>
#include "nlohmann\\json.hpp"
#include <vector>
using namespace std;
using json_t = nlohmann::json;
int main()
json_t j; // JSON对象
j["age"] = 23; // "age":23
j["name"] = "spiderman"; // "name":"spiderman"
j["gear"]["suits"] = "2099"; // "gear":"suits":"2099"
j["jobs"] = "superhero" ; // "jobs":["superhero"]
vector<int> v = 1,2,3 ; // vector容器
j["numbers"] = v; // "numbers":[1,2,3]
map<string, int> m = // map容器
"one",1, "two", 2 ; // 初始化列表
j["kv"] = m; // "kv":"one":1,"two":2
cout << j.dump(2) << endl;
auto str = R"(
"name": "peter",
"age" : 23,
"married" : true
)";
try
auto k = json_t::parse(str); // 从字符串反序列化
assert(k["age"] == 23); // 验证序列化是否正确
assert(k["name"] == "peter");
catch (const std::exception& e)
cout << e.what() << endl;
system("pause");
return 0;
代码示例2
MessagePack(二进制形式)
#include <iostream>
#include <cassert>
#include "nlohmann\\json.hpp"
#include <vector>
#include <msgpack.hpp>
using namespace std;
int main()
vector<int> v = 1,2,3,4,5 ; // vector容器
msgpack::sbuffer sbuf; // 输出缓冲区
msgpack::pack(sbuf, v); // 序列化
auto handle = msgpack::unpack( // 反序列化
sbuf.data(), sbuf.size()); // 输入二进制数据
auto obj = handle.get(); // 得到反序列化对象
vector<int> v2; // vector容器
obj.convert(v2); // 转换反序列化的数据
assert(std::equal( // 算法比较两个容器
begin(v), end(v), begin(v2)));
system("pause");
return 0;
代码示例3
protobuf(二进制形式)
using vendor_t = sample::Vendor; // 类型别名
vendor_t v; // 声明一个PB对象
assert(!v.IsInitialized()); // required等字段未初始化
v.set_id(1); // 设置每个字段的值
v.set_name("sony");
v.set_valid(true);
assert(v.IsInitialized()); // required等字段都设置了,数据完整
assert(v.has_id() && v.id() == 1);
assert(v.has_name() && v.name() == "sony");
assert(v.has_valid() && v.valid());
cout << v.DebugString() << endl; // 输出调试字符串
string enc;
v.SerializeToString(&enc); // 序列化到字符串
vendor_t v2;
assert(!v2.IsInitialized());
v2.ParseFromString(enc); // 反序列化
以上是关于C++中的序列化和反系列化的主要内容,如果未能解决你的问题,请参考以下文章