gRPC反序列化报proto: bad wiretype错误,验证proto有效仍报错如何排查?
gRPC
proto: bad wiretype 异常排查指南 报错信息:
grpc: failed to unmarshal the received message proto: bad wiretype
该错误的核心本质是:反序列化时读取到的字段编码类型(wire type)和.proto定义中对应字段声明的类型不匹配,可按以下顺序排查:
- 先校验proto定义与序列化数据的字段匹配度
你提供的十六进制编码0a06616e6b697461解码后对应规则为:字段号为1、wire type为2(长度分隔类型,对应string/bytes/嵌套消息/打包重复字段等类型)。首先检查你的.proto文件中,编号为1的字段是否属于wire type=2的类型,如果字段1定义为int32、float、bool这类wire type非2的类型,就会直接触发该错误。 - 确认序列化、反序列化两端的proto版本完全一致
排查是否存在服务端使用新版proto定义、客户端使用旧版proto的情况,比如两端对同一字段号的类型定义不同,或字段号对应字段被删除/修改后没有同步更新两端的proto文件。 - 校验传输过程中数据是否被篡改
在反序列化执行前,将你实际收到的二进制字节转成十六进制打印,确认和你校验过的0a06616e6b697461完全一致。排查中间网关、代理、日志打印组件是否将二进制payload当成普通字符串做了转义、编码转换(比如强制UTF-8转码、添加BOM头),导致实际收到的数据和原始序列化结果不一致。 - 检查序列化/反序列化API使用是否正确
排查是否存在混用proto2/proto3的序列化API的情况,或是将JSON、自定义编码等非Protobuf序列化的结果当成Protobuf payload传入了gRPC反序列化接口。 - 校验嵌套消息的定义一致性
如果你对应字段号1是嵌套消息类型,需要进一步检查嵌套消息内部的字段定义,是否和序列化端的嵌套消息定义完全一致,内部字段是否存在wire type不匹配的问题。
快速验证方法
将你校验通过的十六进制0a06616e6b697461转成二进制字节后,直接用本地的proto定义调用反序列化接口:
- 如果本地直接反序列化失败:问题出在proto定义和序列化数据不匹配
- 如果本地直接反序列化成功:问题出在gRPC传输链路中数据被篡改
内容的提问来源于stack exchange,提问作者Saturnian
相关产品推荐
相关产品推荐

