所以我对此有点难过。我在 C++ 端有一个 AMQP 类实现,最终将我的 Porotocol 缓冲区对象序列化为字符串:
qpid::messaging::message qmesg;
std::string msgstr;
ProtoMessage.SerializeToString(&msgstr);
qmesg.setContent(msgstr);
//Proceed to send the message
消息体设置为此,内容类型为二进制。
在 Java 端,我们从 JMSBytesMessage 对象中读取字节,然后尝试将数据解析回协议缓冲区对象:
JMSBytesMessage msg; //Assume this is in the proper context
ProtoMessage.parseFrom(msg.getData().array());
我也试过:
byte[] bytearr = new byte[]
msg.readBytes(bytearr);
这给出了相同的。
当我记录字节数据时,我确实看到了字节值(使用 Array.ToString(byte[]),但上面的 java 端代码抛出了 InvalidProtocolBufferException:
com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
我假设因为它是字节数据,所以它对字符编码是匿名的。我错过了一些明显的东西吗?此外,无论这看起来多么尴尬,请不要提供替代实施建议,只要假设必须使用这个。任何指导将不胜感激。
协议缓冲区字节数组值(可能不需要?为什么不)编辑:差异字节结果,很有趣。
编辑:顶部用 Java 解码,底部用 C++ 编码:
10 0 18 0 34 0 42 0 50 0 58 0 82 0 90 0 98 0 106 0 114 0 122 0 -126 1 6 97 99 99 101 112
10 0 18 0 34 0 42 0 50 0 58 0 82 0 90 0 98 0 106 0 114 0 122 0 130 1 6 97 99 99 101 112
这些只是最初的几个,但这种模式仍在继续。大部分数据是一样的,只是有些字节从无符号变为有符号。我不太会用 Java 工作,所以这里发生了什么?