You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:02:07