【问题标题】:Google protocol buffers-Sending a message form C# client to a java ServerGoogle 协议缓冲区 - 从 C# 客户端向 Java 服务器发送消息
【发布时间】:2012-10-25 12:37:57
【问题描述】:

客户端发送一个 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());

问题:

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

谢谢。

【问题讨论】:

  • 您的意思是 1481 字节,而不是位,对吗?当您说“二进制数据相同”时-与什么相同?很难了解这里的实际情况。
  • 我的意思是byteArray的长度是1481。
  • 对。了解字节和位之间的区别并使用正确的术语很重要。剩下的问题仍然很模糊。
  • 接收到的二进制数据与发送的数据相同
  • 问题虽然接收到的二进制数据与发送的数据相同,但我得到了这个异常:com.google.protobuf.InvalidProtocolBufferException:协议消息包含无效标签(零)。

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


【解决方案1】:

这就是问题所在:

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

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

只需使用:

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

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

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

【讨论】:

  • 如果我将 Reader 转换为字节数组,为什么会丢失大量原始数据?我尝试了您的建议,但我得到了相同的 exceptioncom.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero)
  • 如何在两边都使用base64编码?谢谢!
  • @Kaiser4you:不,你根本不应该使用阅读器。这就是重点。读者关注的是文本数据。协议缓冲区消息是二进制数据。只是不要这样做!如果你绝对必须使用文本,你应该只使用base64 - 这是不太可能的。
  • 谢谢!好的,在这种情况下使用哪个 I/O 流更好:BuffredInputStream 或 DataInputStream 或 ObjectInputStream?
  • @Kaiser4you:除非您使用DataInputStreamObjectInputStream 提供的任何功能,否则不要使用它们。您甚至可能不需要使用BufferedInputStream,因为 IIRC Protobuf 实现会执行缓冲。根据我的回答,只需使用s.getInputStream()
【解决方案2】:

现在它起作用了,SerializingSending 协议缓冲区消息也犯了同样的错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多