Protocol Buffers

Protocol Buffers

跨语言结构化数据序列化方案

开发官网

应用介绍

两个服务之间传数据,用 JSON 最省事,直到某天后端悄悄把字段名从 userId 改成 user_id,前端解析出来一片 undefined——没人拦得住,因为 JSON 里没有契约。而且同样一条记录,JSON 要把字段名重复写进每一行,量大起来带宽和解析时间都不便宜。Protocol Buffers 换了个顺序:先用 .proto 文件把数据结构定义清楚,再让编译器 protoc 生成各语言的读写代码,字段在网络上传的是编号不是名字,体积比 XML 小得多、解析也更快。

它是 Google 内部用了十几年的那套东西,跨语言是重点:一份 .proto 定义,能同时生成 C++、C#、Dart、Go、Java、Kotlin、Objective-C、Python、Ruby、Rust 的代码,proto3 下还能用 PHP。gRPC 的接口描述用的也是它。字段带编号这个设计让前后兼容变得可控——加新字段不影响老客户端,删字段只要保留编号不被复用就行。

Windows 版就是一个 protoc.exe,解压即用,不用安装。

软件功能



.proto 定义即契约:数据结构写在一个独立的 .proto 文件里,前后端、各个服务共用同一份定义,字段名和类型改动一眼可见,不会出现两边各改各的。

protoc 代码生成:一条命令按目标语言生成读写代码,比如 --python_out 出 Python、--java_out 出 Java,序列化和反序列化的逻辑不用自己写也不会写错。

十来种语言支持:官方支持 C++、C#、Dart、Go、Java、Kotlin、Objective-C、Python、Ruby、Rust,proto3 另外支持 PHP,多语言技术栈之间传数据不用各写一套解析。

体积小解析快:二进制编码,字段用编号而不是名字,同一条数据比 XML 和 JSON 都小,解析也更省 CPU,链路上量大时差别明显。

兼容性可控:字段编号一旦分配就固定下来,新增字段老代码可以忽略,废弃字段用 reserved 保留编号防止被复用,接口演进不至于一改就全线返工。

描述符输出:--descriptor_set_out 能把编译结果导成描述符文件,供需要在运行时动态解析消息结构的工具使用。

gRPC 的接口语言:gRPC 用 .proto 描述服务和方法,写接口定义和写数据结构是同一套语法。

免安装单文件:Windows 发行包解压后就是 bin/protoc.exe,放进 PATH 即可使用,不写注册表。

开源:Google 开源,BSD 协议,源码和各语言运行时都在 GitHub 上。