当前位置:   article > 正文

序列化:简单通用的数据交换格式JSON、MessagePack 和 ProtoBuffer_类似json protobu的数据格式有哪些

类似json protobu的数据格式有哪些

序列化,就是把内存里“活的对象”转换成静止的字节序列,便于存储和网络传输;而反序列化则是反向操作,从静止的字节序列重新构建出内存里可用的对象。

数据交换格式:JSON、MessagePack 和 ProtoBuffer。
对数据做序列化和反序列化:

JSON:

JSON 是一种轻量级的数据交换格式,采用纯文本表示,所以是“human readable”,阅读和修改都很方便。JSON。第三工具:精选出序列化 / 反序列化、网络通信、脚本语言混合编程和性能分析这四类工具。

由于 JSON 起源于“最流行的脚本语言”JavaScript,所以它也随之得到了广泛的应用,在 Web 开发领域几乎已经成为了事实上的标准,而且还渗透到了其他的领域。比如很多数据库就支持直接存储 JSON 数据,还有很多应用服务使用 JSON 作为配置接口。在JSON 的官方网站上,你可以找到大量的 C++ 实现,不过用起来都差不多。因为 JSON 本身就是个 KV 结构,很容易映射到类似 map 的关联数组操作方式。

JSON 格式注重的是方便易用,在性能上没有太大的优势,所以一般选择 JSON 来交换数据,通常都不会太在意性能(不然肯定会改换其他格式了),还是自己用着顺手最重要。

JSON for Modern C++

JSON for Modern C++ 可能不是最小最快的 JSON 解析工具,但功能足够完善,而且使用方便,仅需要包含一个头文件“json.hpp”,没有外部依赖,也不需要额外的安装、编译、链接工作,适合快速上手开发。JSON for Modern C++ 可以用“git clone”下载源码,或者更简单一点,直接用 wget 获取头文件就行:

git clone git@github.com:nlohmann/json.git    # git clone
wget https://github.com/nlohmann/json/releases/download/v3.7.3/json.hpp  # wget 
  • 1
  • 2

JSON for Modern C++ 使用一个 json 类来表示 JSON 数据,为了避免说的时候弄混,我给这个类起了个别名 json_t:

using json_t = nlohmann::json;
  • 1

json_t 的序列化功能很简单,和标准容器 map 一样,用关联数组的“[]”来添加任意数据。你不需要特别指定数据的类型,它会自动推导出恰当的类型。比如,连续多个“[]”就是嵌套对象,array、vector 或者花括号形式的初始化列表就是 JSON 数组,map 或者是花括号形式的 pair 就是 JSON 对象,非常自然:

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}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

添加完之后,用成员函数 dump() 就可以序列化,得到它的 JSON 文本形式。默认的格式是紧凑输出,没有缩进,如果想要更容易阅读的话,可以加上指示缩进的参数:

cout << j.dump() << endl;         // 序列化,无缩进
cout << j.dump(2) << endl;        // 序列化,有缩进,2个空格
  • 1
  • 2

json_t 的反序列化功能同样也很简单,只要调用静态成员函数 parse() 就行,直接得到 JSON 对象,而且可以用 auto 自动推导类型:

string str = R"({
                   // JSON文本,原始
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/689036
推荐阅读
相关标签
  

闽ICP备14008679号