0

获取 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"}
4

1 回答 1

0

对于您的消息,序列化形式应为以下 5 个字节08-01-12-01-311parseFrom(byte[])方法期望这样的编码。当您给它一个 JSON 时,它会误解字符串中的字符并失败。例如,'{'表示使用标签 15 开始一个组(此功能已弃用)。

我将假设您正在使用 Web 框架。您为服务器中的响应提供 protobuf 消息,框架将 JSON 表示发送到客户端。

为了让客户端使用 JSON 表示,您可以使用以下代码。

JsonFormat.parser().merge(theJsonString, Test2.newBuilder())

当然,您不是“使用 protobuf”。相反,您只是使用 protobuf 生成的类。


  1. 有关编码的更多信息,请参阅文档并试用解码器
于 2019-07-09T10:44:07.083 回答