找回密码
 立即注册
查看: 261|回复: 6

如何阅读protobuf源码?

[复制链接]
发表于 2021-10-9 19:37 | 显示全部楼层 |阅读模式
protobuf非常强大易用,但是我想阅读源码不知如何下手。
发表于 2021-10-9 19:43 | 显示全部楼层
这是个平台无关的库,装个VS2017,把它编译运行起来,单步跟踪、goto definition什么的都很方便。
protobuf 大概分成两部分:compiler 和 runtime 。
compiler 的前端是手写的递归下降 parser ,如果你学过编译原理,很容易读懂。这个编译器的后端是各个目标语言的代码生成器,可以选你熟悉的来读。前后端通过 descriptor 联系起来,非常清晰,也便于扩展。
runtime 主要功能是序列化和反序列化。每个目标语言各有一套,可以根据需要来读,一般要结合生成的代码一起读。
发表于 2021-10-9 19:44 | 显示全部楼层
我就提示几点:
    Protobuf有一套插件体系,protoc编译器将协议的schema描述通过标准输出发送给插件,以达到跨语言而又无需使用Protobuf源码就可实现插件功能。
2. Protobuf分析协议schema的词法器支持注释读取,这点比大多数编译器要高级而且复杂一些。
3. Protobuf的C++实现比其他语言多了一套动态消息,文件是dynamic_message。如果你不写C++这块可以忽略,动态消息的功能在其他语言里会通过语言的反射直接实现,不需要为C++这么封装。
4. Protobuf的流是可以抽象的,从内存、文件到zip文件,有相应的类进行描述。
5. 最新3.x版本的Protobuf的代码实现比2.x复杂很多,如果实在看的困难可以下载2.x的代码看下,老版本特性少一些,代码和生成代码相对简单。
发表于 2021-10-9 19:54 | 显示全部楼层
专注于服务器后台开发,包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等
发表于 2021-10-9 19:55 | 显示全部楼层
我感觉题主的学习方法好像有点不是特别好,我觉得应该先看原理介绍,理解了原理以后自己根据原理实现一次,实现完了以后再和官方的源码做对比,看看自己还有哪些地方考虑的没有官方全面、做的没有官方好,然后针对自己平时的使用需求,分析如何更有针对性的优化设计和实现会更好,并进行相应的测试和分析。所以,官方的源码应该是相关原理的一种参考示例,而不是学习教科书。
发表于 2021-10-9 20:00 | 显示全部楼层
带着工程问题去阅读源码才是最好的打开方式。瞎读会浪费很多时间。

譬如,protobuf 是如何压缩解压缩数据的,是如何组织数据,如何实现反射等等等。

多提问,多实践。
 楼主| 发表于 2021-10-9 20:00 | 显示全部楼层
建议第一步是在草稿纸上序列化和反序列化一个复杂message,第二步是给protobuf写测试代码,后面的事情都是水到渠成
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 17:26 , Processed in 0.092451 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表