Protobuf与JSON对比:Protobuf是否支持数据存储及相关疑问
Protobuf 与 JSON 相关疑问解答
1. Protobuf 是否可以用于数据存储?
完全可以,Protobuf 原生支持数据存储场景,和 JSON 存为明文文件的逻辑本质一致,只是存储的内容形式不同。
- 实际使用中大量项目已经落地了 Protobuf 存储方案,比如 Kafka 元数据持久化、部分分布式配置中心的配置存储,相比 JSON 存储体积能缩减 30%~70%,序列化/反序列化速度提升数倍。
- 存储操作流程:先定义
.proto格式的 message 结构,生成对应开发语言的实体类,给类实例赋值后调用自带的序列化方法得到二进制字节流,直接写入磁盘文件、数据库等存储介质即可;读取时取出字节流调用反序列化方法就能还原为结构化数据。
2. Protobuf 是否仅被设计为接口定义语言使用?
不是。接口定义(IDL)只是 Protobuf 的附属能力之一,它的核心定位是通用结构化数据序列化/反序列化协议,接口定义能力只是为了方便跨语言、跨服务的结构约定,不管是跨网络的服务通讯,还是本地的持久化存储,所有需要对结构化数据做高效序列化的场景都可以使用 Protobuf。
3. 对比示例的差异是否是我的理解偏差?
这不是你的理解问题,是绝大多数对比文章表述不严谨导致的认知偏差:
很多文章没有讲清楚二者的对应关系:
.proto文件中的 message 字段定义,本质对应 JSON 的数据结构约定(通常是写在需求文档里的规则,比如要求JSON必须包含哪些字段、对应类型是什么);而 Protobuf 序列化后的二进制内容,才是和 JSON 明文键值对内容对等的存在。
举个直观的对应示例:
Protobuf 结构定义:
message User { string name = 1; int32 age = 2; }
对应 JSON 的结构约定为「必须包含字符串类型的name字段、数字类型的age字段」;
赋值后的 Protobuf 序列化二进制流,对应 JSON 明文 {"name":"张三","age":18}。
二者的对比维度应该是相同数据内容下的序列化体积、编解码速度、可读性、兼容性等指标,完全可以做公平对比。
4. Protobuf 的「二进制格式」具体指什么?
这里的二进制指的是 Protobuf 序列化后的输出不是人类可读的明文文本,而是符合 Protobuf 编码规则的二进制字节流:
- 比如上面的User示例,JSON存储的是肉眼可直接识别的
{"name":"张三","age":18},共约27字节; - Protobuf序列化后的输出用十六进制表示为
0a 06 e5 bc a0 e4 b8 89 10 12,仅9字节,用普通文本编辑器打开会显示为乱码,必须持有对应结构的Protobuf定义才能反序列化读取内容。
内容的提问来源于stack exchange,提问作者Mydrive1997
相关产品推荐
相关产品推荐

