Ilingis 发表于 2021-10-9 19:37

如何阅读protobuf源码?

protobuf非常强大易用,但是我想阅读源码不知如何下手。

unityloverz 发表于 2021-10-9 19:43

这是个平台无关的库,装个VS2017,把它编译运行起来,单步跟踪、goto definition什么的都很方便。
protobuf 大概分成两部分:compiler 和 runtime 。
compiler 的前端是手写的递归下降 parser ,如果你学过编译原理,很容易读懂。这个编译器的后端是各个目标语言的代码生成器,可以选你熟悉的来读。前后端通过 descriptor 联系起来,非常清晰,也便于扩展。
runtime 主要功能是序列化和反序列化。每个目标语言各有一套,可以根据需要来读,一般要结合生成的代码一起读。

RedZero9 发表于 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的代码看下,老版本特性少一些,代码和生成代码相对简单。

ainatipen 发表于 2021-10-9 19:54

专注于服务器后台开发,包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等

LiteralliJeff 发表于 2021-10-9 19:55

我感觉题主的学习方法好像有点不是特别好,我觉得应该先看原理介绍,理解了原理以后自己根据原理实现一次,实现完了以后再和官方的源码做对比,看看自己还有哪些地方考虑的没有官方全面、做的没有官方好,然后针对自己平时的使用需求,分析如何更有针对性的优化设计和实现会更好,并进行相应的测试和分析。所以,官方的源码应该是相关原理的一种参考示例,而不是学习教科书。

kirin77 发表于 2021-10-9 20:00

带着工程问题去阅读源码才是最好的打开方式。瞎读会浪费很多时间。

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

多提问,多实践。

Ilingis 发表于 2021-10-9 20:00

建议第一步是在草稿纸上序列化和反序列化一个复杂message,第二步是给protobuf写测试代码,后面的事情都是水到渠成
页: [1]
查看完整版本: 如何阅读protobuf源码?