Protocol Buffers是否会出现部分读取的情况?
Protocol Buffers 是否会出现部分读取的情况?
先看你提到的JSON场景:
当发送完整的JSON数组:
[ {"someProperty": 1, "otherProperty": 2}, {"someProperty": 2, "otherProperty": 3}]
如果连接中断只收到:
[ {"someProperty": 1, "otherProperty": 2}
JSON解码器会直接抛出异常,不会处理不完整的负载。
但Protocol Buffers完全可能出现部分读取的有效负载,具体原因和表现如下:
- Protobuf采用自包含的键值编码结构,每个字段(包括重复字段里的元素)都带有明确的字段标识和长度信息,解码器不需要依赖整个数据的闭合结构来判断有效性。
- 举个例子,假设定义了这样的Protobuf消息:
message Item { int32 some_property = 1; int32 other_property = 2; } message ItemList { repeated Item items = 1; }
当发送包含两个Item的ItemList时,如果传输中断,只收到第一个Item的完整编码字节,Protobuf解码器会成功解析出一个只包含单个Item的ItemList,不会抛出任何异常——它无法感知到原本还有后续数据未传输完成。
- 本质原因是Protobuf的编码是无终止符的流式设计,解码器会持续解析直到没有可识别的有效字节,不会校验数据是否完整。这和JSON必须满足完整语法结构的特性完全不同。
内容的提问来源于stack exchange,提问作者Gabriel Furstenheim
相关产品推荐
相关产品推荐

