Protobuf反序列化失败求助:仅Request.push场景出现报错
Protobuf反序列化报错:输入在字段中途意外结束(仅PushRequest场景)
问题分析
你遇到的InvalidProtocolBufferException核心原因是错误地用字符流读取二进制Protobuf数据:
- Protobuf序列化结果是二进制字节流,并非UTF-8文本格式
- 使用
BufferedReader(字符流读取器)读取请求体时,会尝试将二进制字节按UTF-8编码解析为字符,这个过程会破坏原始二进制结构(比如将非UTF-8字节替换为占位符) - LoginRequest/SyncRequest字段少、内容简单,可能刚好没触发致命损坏;但PushRequest包含重复的Item嵌套结构,二进制内容更复杂,被破坏后直接导致反序列化时识别为“输入截断”
解决方案
直接从HttpServletRequest获取原始输入流读取,跳过字符流转换步骤:
@Override protected void doPost(final HttpServletRequest httpRequest, final HttpServletResponse httpResponse) throws ServletException, IOException { final byte[] buffer = IOUtils.toByteArray(httpRequest.getInputStream()); final Request request; try { request = Request.parseFrom(buffer); } catch(final Exception e) { throw new ServletException("Failed to deserialize request body.", e); } // 后续业务逻辑... }
关键说明
httpRequest.getInputStream()返回原始二进制输入流,能完整保留Protobuf序列化后的字节数据- 移除
BufferedReader和StandardCharsets.UTF_8相关转换逻辑,避免二进制数据被篡改
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

