gpt4 book ai didi

java - 在 jackson 生成的 json 中包装 Protocol Buffer 时 java 出错?

转载 作者:行者123 更新时间:2023-11-29 05:54:08 29 4
gpt4 key购买 nike

我通过执行以下操作发送和接收 HTTP post 请求:

FooJson fooJson = new FooJson();
fooJson.setName("Bob");

FooProto.Builder fooProto = FooProto.newBuilder(); // google protobuf
fooProto.setColor("Blue");
fooProto.setLength(30);

BarProto.Builder barProto = BarProto.newBuilder();
barProto.setWeight(65);
fooProto.setBarProto(barProto);

barJson.setFooProto(new String(fooProto.build().toByteArray()));
List<BarJson> barJsonList = new ArrayList<BarJson>();
barJsonList.add(barJson);
fooJson.setBarJsonList(barJsonList);
String data = writeJson(fooJson); // wrapper for jackson JsonGenerator
RequestEntity re = new ByteArrayRequestEntity(data.getBytes());

PostMethod method = new PostMethod("http://foo.net:123/path");
method.setRequestEntity(re);
httpClient.executeMethod(method);

在接收端,我解析如下:

FooJson fooJson = readJson(request.getInputStream(), FooJson.class);
for (BarJson barJson : fooJson.getBarJsonList()) {
FooProto fooProto = FooProto.parseFrom(barJson.getFooProto().getBytes());
}

接收端解析protocol buffer的结果为:

com.google.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field.  This could mean either than the input has been truncated or that an embedded message misreported its own length.

我将 Protocol Buffer 转换为字符串的方式有问题吗?我该如何解决这个问题?

最佳答案

我怀疑您是否可以通过 JSON 可靠地传输 protobuf(其有效负载是纯二进制,而不是文本),而无需执行某种类型的编码,如 base64 或十六进制编码。将您的 protobuf 负载从字节转换为 base64 文本。然后在接收端将其从 base64 文本转换回二进制。

您收到 protobuf 异常,因为接收端的字节数组与您发送的 protobuf 负载不匹配。当您在不使用某种类型的编码的情况下转换为字符串并返回时,数据被篡改了。

我在 javax.xml.bind.DatatypeConverter 方面运气不错。它是 Java 1.6 的一部分。在发送端使用 printBase64Binary,在接收端使用 parseBase64Binary。

[更新]

或者,如果 base64 太难看,您可以使用 protobuf-java-format 将您的 protobuf 对象序列化为几种不同的字符串格式(JSON、XML)。 .这可能看起来有点奇怪,因为 barJson.setFooProto 将包含一个本身就是 JSON 负载的字符串。会有很多转义引号字符 - 但它应该有效。

关于java - 在 jackson 生成的 json 中包装 Protocol Buffer 时 java 出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12810414/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com