java - 如何修复“解析协议消息时,输入意外在字段中间结束”错误
问题描述
获取 InvalidProtocolBufferException:解析协议消息时,输入在字段中间意外结束。解析 Protobuf 时出错
如果我在响应对象上调用 response.getContentAsString() 方法,虽然我可以看到输出,但不确定为什么解析失败。
我的原型文件:
syntax = "proto2";
package com.test.protocol;
option java_package = "com.test.protocol.v1";
option java_outer_classname = "Test1";
message Test2 {
required int64 id = 1;
required string value = 2
}
我编写了 API 来返回 Proto 响应,如下所示
final Test2.Builder builder = TEST2.newBuilder();
builder.setId(1);
builder.setValue("1");
return builder.build();
我的 API 将返回以下输出
{"id": 1,"value": "1"}
我正在尝试调用 API 并将其解析回 Test2,如下所示
import com.test.protocol.v1.Test1.Test2;
final Test2 result = Test2.parseFrom(response.getContentAsByteArray());
在上述步骤中出现错误如果我调试并尝试打印 response.getContentAsString(),我会得到正确的输出,如下所示,但解析失败。
{"id": 1,"value": "1"}
解决方案
对于您的消息,序列化形式应为以下 5 个字节08-01-12-01-31
。1该parseFrom(byte[])
方法期望这样的编码。当您给它一个 JSON 时,它会误解字符串中的字符并失败。例如,'{'
表示使用标签 15 开始一个组(此功能已弃用)。
我将假设您正在使用 Web 框架。您为服务器中的响应提供 protobuf 消息,框架将 JSON 表示发送到客户端。
为了让客户端使用 JSON 表示,您可以使用以下代码。
JsonFormat.parser().merge(theJsonString, Test2.newBuilder())
当然,您不是“使用 protobuf”。相反,您只是使用 protobuf 生成的类。
推荐阅读
- python - 如何将相同的列数组分配给 Pandas 中的多个数据框?
- java - 无法显示数组列表的所有元素
- cmake - 如何使用不同的构建树 find_package()?
- c - 我的问题是关于 get_next_line 函数,我应该读取文件并使用多个缓冲区大小
- javascript - Javascript函数更新html字段然后删除它
- javascript - 在 Keycloak 中针对客户端对用户进行身份验证
- java - 忽略 @EqualsAndHashCode 中的 HashCode - Lombok
- c# - PostMessage,如何发送CTRL BUTTON?
- jquery - .net core 2.2 上带有 antiforgerytoken 的 ajax Post 请求
- php - 如何使用视图中的参数调用控制器中的函数?