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++中的序列化和反系列化的主要内容,如果未能解决你的问题,请参考以下文章

C++中的序列化和反系列化

c++中的序列化与反序列化怎么实现的?

是否可以在 C++ 中序列化和反序列化一个类?

用c或c++实现结构体的序列化和反序列化

Java中的序列化和反序列化

Java中的序列化和反序列化