gau*_*v46 5 java protocol-buffers protobuf-net
我试图解析在vb.net中生成的java中的多个协议缓冲区消息
我正在使用优秀的protobuf-net将多个消息流式传输到java,如下所示:
ProtoBuf.Serializer.SerializeWithLengthPrefix(Of Msg)(postStream, msg,
ProtoBuf.PrefixStyle.Base128)
Run Code Online (Sandbox Code Playgroud)
在Java中,我使用以下代码来解析消息
final byte[] buffer = new byte[4096];
for (int c = ins.read(buffer); c >= 0; c = ins.read(buffer)) {
Msg msg = Msg.parseDelimitedFrom(new ByteArrayInputStream(buffer));
}
Run Code Online (Sandbox Code Playgroud)
问题是在解析第一个消息之后,它会在第二次解析时抛出错误并出现以下错误:
com.google.protobuf.InvalidProtocolBufferException:在解析协议消息时,输入意外地在字段中间结束.这可能意味着要么输入被截断,要么嵌入的消息误报了自己的长度.
缓冲区大小和邮件大小应该相同吗?如果是,那么我应该如何解析它,特别是对于大型消息.
问题是您需要直接从原始流中读取,而不是一次读取一个块。(即使你知道每条消息正好是 4096 字节,你也不能确定一次读那么多)我建议你使用
while(stream still open) {
Msg msg = Msg.parseDelimitedFrom(ins);
}
Run Code Online (Sandbox Code Playgroud)
注意:TCP是流协议,而不是消息协议。您只能保证一次读取一个字节,您获得的任何额外字节都是额外的奖励。
归档时间: |
|
查看次数: |
1302 次 |
最近记录: |