1

客户端发送一个 1481 字节的数组。服务器可以毫无问题地读取所有 1481 字节的消息,但是通过从接收到的二进制数组中解析给定的消息,我得到了这个异常

com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).

二进制数据是一样的。我检查了我是否使用了正确版本的 proto 文件。我有点不知所措。任何帮助表示赞赏。

代码

byte [] data= IOUtils.toByteArray(br1, "ASCII"); System.out.println("SIZE:" + data.length);
AddressBook adb1 = AddressBook.parseFrom(data); System.out.println("Server: Addressbook:" + adb1.getPersonCount()); System.out.println("Server: Addressbook:" + adb1.getPerson(0).getName());

问题:

我需要找到一种方法来正确解析从读取的 1481 字节数组中接收到的地址簿消息。

谢谢。

4

2 回答 2

2

这就是问题:

br1 = new InputStreamReader(s.getInputStream());

这是试图将不透明的二进制数据视为text。它不是文本,而是二进制数据。因此,当您将其Reader转换为字节数组时,您会丢失大量原始数据 - 难怪它是无效的协议缓冲区。

只需使用:

AddressBook adb1 = AddressBook.parseFrom(s.getInputStream());

并避免有损文本转换。当然,这是假设您在 C# 方面没有遇到同样的问题。

如果你必须通过文本,你应该在两边都使用 base64 编码。

于 2012-10-31T20:00:11.927 回答
0

现在它起作用了,我通过序列化发送协议缓冲区消息犯了同样的错误

于 2012-11-06T19:14:07.363 回答