Google协议缓冲区 - 从C#客户端向Java服务器发送消息

时间:2012-10-25 12:37:58

标签: c# java stream network-programming protocol-buffers

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

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());

问题:

我需要找到一种方法来正确解析收到的Adressbook msg,读取的是1481字节。

感谢。

2 个答案:

答案 0 :(得分:2)

这是问题所在:

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

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

只需使用:

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

并避免有损文本转换。当然,假设你没有在C#方面得到同样的破坏。

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

答案 1 :(得分:0)

现在它有效我在SerializingSending的协议缓冲消息中犯了同样的错误