罗剑锋的 C++ 实战笔记
罗剑锋
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
34779 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 32 讲
结束语 (1讲)
罗剑锋的 C++ 实战笔记
15
15
1.0x
00:00/00:00
登录|注册

15 | 序列化:简单通用的数据交换格式有哪些?

你好,我是 Chrono。
在前面的三个单元里,我们学习了 C++ 的语言特性和标准库,算是把 C++ 的编程范式、生命周期、核心特性、标准库的内容整体过了一遍。从今天起,我们的学习之旅又将开启一个新的篇章。
C++ 语言和标准库很强大,功能灵活,组件繁多,但也只能说是构建软件这座大厦的基石。想要仅凭它们去“包打天下”,不能说是绝对不可行,但至少是“吃力难讨好”。
还是那句老话:“不要重复发明轮子。”(Reinventing the wheel)虽然很多 C++ 程序员都热衷于此,但我觉得对于你我这样的“凡人”,还是要珍惜自己的时间和精力,把有限的资源投入到能有更多产出的事情上。
所以,接下来的这几节课,我会介绍一些第三方工具,精选出序列化 / 反序列化、网络通信、脚本语言混合编程和性能分析这四类工具,弥补标准库的不足,节约你的开发成本,让你的工作更有效率。
今天,我先来说一下序列化和反序列化。这两个功能在软件开发中经常遇到,你可能很熟悉了,所以我只简单解释一下。
序列化,就是把内存里“活的对象”转换成静止的字节序列,便于存储和网络传输;而反序列化则是反向操作,从静止的字节序列重新构建出内存里可用的对象。
我借用《三体》里的内容,打一个形象的比喻:序列化就是“三体人”的脱水,变成干纤维,在乱纪元方便存储运输;反序列化就是“三体人”的浸泡,在恒纪元由干纤维再恢复成活生生的人。(即使没读过《三体》,也是很好理解的吧?)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《罗剑锋的 C++ 实战笔记》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(28)

  • 最新
  • 精选
  • 被讨厌的勇气
    直接memcpy,同一种语言不同机器,或者不同语言可能存在兼容问题(变量内存存储布局、编码可能不同),而Json是一种标准,由Json库处理编码问题(比如大小端),且不同语言间统一,对头不?

    作者回复: 说的很对。

    33
  • 蓝配鸡
    序列化/反序列化命名就用 “脱水/浸泡”, 会不会被打死- -

    作者回复: 我觉得可以小范围推广一下,以后没准会流行起来,笑。

    11
  • java2c++
    问题2:和redis交互一般使用json,主要原因是可读性强,有问题时直接登录到redis控制台可以查看json内容,不过序列化需要的时间成本空间成本都是最高,如果追求性能就需要选择其他的了。 现在一些网络框架(rpc框架)都支持多种序列化的方式了,msgpack,thift跨语言支持的比较好,性能也不错我工作中相对用的多一些

    作者回复: 很好的经验分享,json主要是对人友好,用来做人机接口很合适。

    11
  • json不存在大小端,字节序的问题吧,反正就是一个字符串。messagepack这种二进制格式的东西,才要考虑大小端。

    作者回复: 对,json是字符串的文本形式,数字也表示成了文本,不需要考虑大小端问题。

    7
  • hy
    pb有2G内存限制问题,如果对象过大会不行

    作者回复: pb好像确实有限制,我记得好像是64mb还是512mb,不是很确定。 这也是很合理的考虑,如果有超大对象,是不是要反思一下设计的问题,为什么会有这么大的对象,能否优化。

    7
  • Why not.
    jsoncpp 也挺好用的 不知道老师怎么看

    作者回复: jsoncpp比较老了,不是那么“现代”,但用起来也还可以。

    3
  • do it
    1、为什么要有序列化和反序列化,直接 memcpy 内存数据行不行呢? 字节序问题;序列号反序列化可数据压缩(不确定😁) 2、你最常用的是哪种数据格式?它有什么优缺点? 工作中使用json多一点,有时使用pb。 pb:压缩效率算优点吧。改变结构需重新生成proto文件、proto怎么难阅读算不足之处

    作者回复: 说的挺好,常用的序列化也就是这几种了

    3
  • java2c++
    问题1:针对跨服务间的调用,涉及到网络传输,需要使用到字节流进行传输,序列化就是发送方将数据对象转化成字节流的过程,反序列就是接收方将字节流转化成数据对象的逆过程

    作者回复: 这是序列化和反序列化的目的,但还没有说到根本上,如果单纯的memcpy,也是可以转换成字节流的。 可以参考其他同学的留言。

    3
  • EncodedStar
    序列化和反序列化 可以按用户自定义的方式去读取吧,底层应该也是用类似memcpy这样的操作去处理里,只不过是又封装了一次统一接口方便我们使用,老师,我可以这么理解吗?? 常用json 和 pb ,感觉就是json对C++不是很友好,很多时候有\转义符困扰,pb就是每次比较麻烦,改了协议之后还的生成一下对应文件

    作者回复: 1.序列化不是简单的memcpy,有点类似按照特定的规则去编码解码,屏蔽了硬件体系架构、语言的差异,是一种通用的格式。 2.json我觉得还行吧,用转义符那是没办法,C的老问题了。pb确实操作起来很麻烦,累。

    3
  • 于小咸
    除了兼容不同语言外,序列化还有一个重要的作用是数据保存和网络传输,我们很难保证不同平台上内存里存的数据是一样的。 此外,对于包含指针的数据结构,我们是没法简单的memcpy,这会带来浅拷贝类似的问题。

    作者回复: 说的非常好。

    2
收起评论
显示
设置
留言
28
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部