java - Google Protocol Buffers 无法正确读取

标签 java ubuntu protocol-buffers

我刚刚建立一个新的 Java 项目,它将(也许,现在不太确定)使用 Google Protocol Buffers。我是这个 API 的新手,所以我从一个非常基本的测试开始。说实话,这次测试的结果让我非常失望。为什么这个非常简单的代码不起作用?

var output = new ByteArrayOutputStream();
Message.Echo.newBuilder().setMsg("MSG1?").build().writeTo(output);
System.out.println("output.length " + output.toByteArray().length);
Message.Echo.newBuilder().setMsg("MSG2!!").build().writeTo(output);
System.out.println("output.length " + output.toByteArray().length);

var input = new ByteArrayInputStream(output.toByteArray());
System.out.println("input.available " + input.available());
System.out.print(Message.Echo.parseFrom(input));
System.out.println("input.available " + input.available());
System.out.print(Message.Echo.parseFrom(input));

上面的代码产生以下输出:

output.length 7
output.length 15
input.available 15
msg: "MSG2!!"
input.available 0

它完全错过了第一条消息,或者更确切地说,它似乎以某种方式“覆盖”了它,因为所有 15 个字节都被读取了。另外,考虑到没有更多字节可供读取,它无法在第二次调用时阻塞。

但是,将两行阅读内容更改为:

System.out.print(Message.Echo.parseFrom(input.readNBytes(7)));
System.out.print(Message.Echo.parseFrom(input.readNBytes(15-7)));

正确打印两条消息。我正在使用 JDK 11 运行 Kubuntu 18.04。我是否遗漏了一些非常重要的东西(官方教程中未提及)或者这是一个错误?

这是 .proto 文件:

syntax = "proto3";

package ...;

option java_package = "...";
option java_outer_classname = "Message";

message Echo {
    string msg = 1;
}

最佳答案

好吧,为了使用同一组流写入/读取多条消息,需要使用 writeDelimitedToparseDelimitedFrom 来代替,因为parseFrom 读取直到到达 EOF。

似乎首选行为是为每条消息使用一个新的 Socket。这对我来说听起来有点奇怪,但我确信这背后有充分的理由。不过官方教程应该有更好的解释。

关于java - Google Protocol Buffers 无法正确读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55801814/

相关文章:

用于匹配多行嵌套注释的java正则表达式

java - 无法使用 Spring Data 功能绑定(bind)数据

typescript - 强制 Protobuf.js 忽略无法识别的 JS 端字段

java - 无法访问 jar 文件? [Ubuntu、Linux]

java - 如何在其他模块的源集中添加 proto 生成的文件?

java - com.google 无法解析为类型

java - LibGDX : Rendering a TextureRegion renders whole texture

java - Eclipse - 如何在没有 web.xml 文件的情况下发布非 Java 资源?

python - 导入错误 : No module named mosquitto

Ubuntu 上的 Eclipse : How do I access projects remotely over mounted SFTP connections?