当前位置 : 主页 > 大数据 > 区块链 >

Protobuf c#to java反序列化多条消息

来源:互联网 收集:自由互联 发布时间:2021-06-22
我试图解析在vb.net中生成的 java中的多个协议缓冲区消息 我正在使用优秀的protobuf-net将多个消息流式传输到java,如下所示: ProtoBuf.Serializer.SerializeWithLengthPrefix(Of Msg)(postStream, msg, ProtoBu
我试图解析在vb.net中生成的 java中的多个协议缓冲区消息

我正在使用优秀的protobuf-net将多个消息流式传输到java,如下所示:

ProtoBuf.Serializer.SerializeWithLengthPrefix(Of Msg)(postStream, msg, 
       ProtoBuf.PrefixStyle.Base128)

在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));
}

问题是在解析第一个消息之后,它会在第二次解析时抛出错误并出现以下错误:

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.

缓冲区大小和邮件大小应该相同吗?如果是,那么我应该如何解析它,特别是对于大型消息.

问题是您需要直接从原始流中读取,而不是一次只读取一个块. (即使你知道每条消息都是4096字节,你也不能确定一次读取那么多)我建议你使用

while(stream still open) {
    Msg msg = Msg.parseDelimitedFrom(ins);
}

注意:TCP是流协议,而不是消息协议.您只能保证一次读取一个字节,并且您获得的任何额外字节都是奖励.

网友评论