如何修复“解析协议消息时,输入在字段中间意外结束”错误

问题描述 投票:0回答:1

获取 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"}
java protocol-buffers protobuf-java
1个回答
0
投票

对于您的消息,序列化形式应为以下 5 个字节

08-01-12-01-31
1
parseFrom(byte[])
方法需要这样的编码。当您给它一个 JSON 时,它会误解字符串中的字符并失败。例如,
'{'
表示开始一个标签为15的组(此功能已弃用)。

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

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

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

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


  1. 有关编码的更多信息,请参阅文档并尝试解码器
© www.soinside.com 2019 - 2024. All rights reserved.