罗剑锋的C++实战笔记17-序列化:简单通用的数据交换格式有哪些?

在前面的三个单元里,我们学习了 C++ 的语言特性和标准库,算是把 C++ 的编程范式、生命周期、核心特性、标准库的内容整体过了一遍。从今天起,我们的学习之旅又将开启一个新的篇章。

C++ 语言和标准库很强大,功能灵活,组件繁多,但也只能说是构建软件这座大厦的基石。想要仅凭它们去“包打天下”,不能说是绝对不可行,但至少是“吃力难讨好”。

还是那句老话:“不要重复发明轮子。”(Reinventing the wheel)虽然很多 C++ 程序员都热衷于此,但我觉得对于你我这样的“凡人”,还是要珍惜自己的时间和精力,把有限的资源投入到能有更多产出的事情上。

所以,接下来的这几节课,我会介绍一些第三方工具,精选出序列化 / 反序列化、网络通信、脚本语言混合编程和性能分析这四类工具,弥补标准库的不足,节约你的开发成本,让你的工作更有效率。

今天,我先来说一下序列化和反序列化。这两个功能在软件开发中经常遇到,你可能很熟悉了,所以我只简单解释一下。

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

我借用《三体》里的内容,打一个形象的比喻:序列化就是“三体人”的脱水,变成干纤维,在乱纪元方便存储运输;反序列化就是“三体人”的浸泡,在恒纪元由干纤维再恢复成活生生的人。(即使没读过《三体》,也是很好理解的吧?)

接下来,我就和你介绍三种既简单又高效的数据交换格式:JSON、MessagePack 和 ProtoBuffer,看看在 C++ 里怎么对数据做序列化和反序列化。

JSON

JSON 是一种轻量级的数据交换格式,采用纯文本表示,所以是“human readable”,阅读和修改都很方便。

由于 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

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

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员zhi路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值