有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Google protocol Buffers将消息表单C#客户端发送到java服务器

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

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

二进制数据是相同的。我检查了我使用的原型文件的正确版本。我有点不知所措。感谢您的帮助

代码

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字节数组中接收到的AddressBook msg

谢谢


共 (2) 个答案

  1. # 1 楼答案

    现在它工作了,我在SerializingSending协议缓冲消息时犯了同样的错误

  2. # 2 楼答案

    这就是问题所在:

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

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

    只需使用:

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

    并避免有损文本转换。当然,这是假设你的C#端没有同样的损坏

    如果必须通过文本,则应在两侧使用base64编码