java - 如何在 Ruby 和 Java 之间序列化/解析 protobuf 对象?

标签 java ruby rabbitmq protocol-buffers

在 ruby​​ 中序列化 protobuf 对象并在 Java 中解析的正确方法是什么?这是为了自动化测试,我们正在 Rabbit 队列上监听此消息。

发布者( ruby ):

protoNew = Protobuf::Request.new
protoNew.request = request
protoNew.id = id.to_i
protoNew.authentication = authentication

return protoNew.serialize_to_string

消费者(Java):

    @Override
    public void onMessage(Message message, Channel channel) 
    {
        ProtoRequest protoRequest;
        try {
            protoRequest = ProtoRequest.parseFrom(message.getBody());
        } catch (InvalidProtocolBufferException e1) {
            logger.error("Error parsing protobuf", e1);
        } 

这是我看到的错误:

Error parsing protobuf: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag. at com.google.protobuf.InvalidProtocolBufferException.invalidEndTag(InvalidProtocolBufferException.java:94) [protobuf-java-2.6.1.jar:] at com.google.protobuf.CodedInputStream.checkLastTagWas(CodedInputStream.java:174) [protobuf-java-2.6.1.jar:] at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:139) [protobuf-java-2.6.1.jar:] at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:168) [protobuf-java-2.6.1.jar:] at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:180) [protobuf-java-2.6.1.jar:] at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:185) [protobuf-java-2.6.1.jar:] at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49) [protobuf-java-2.6.1.jar:]

最佳答案

不清楚您如何打包 protoNew.serialize_to_string 输出,使其成为 Java 代码的 JMS 消息的内容。我猜是因为 char 编码的缘故,有些事情变得一团糟。

作为解决方法,您可以对 protoNew.serialize_to_string 的二进制输出进行 Base 64 编码,并在 Java 端进行 Base 64 解码。

require "base64"
...
return Base64.encode64 protoNew.serialize_to_string

在 Java 方面,

import org.apache.commons.codec.binary.Base64;
...
protoRequest = ProtoRequest.parseFrom(Base64.decodeBase64(message.getBody()))

上述解决方案的一个缺点是,与纯二进制形式相比,它会导致更大的有效载荷大小。

PS:请注意,如果我将 person.serialize_to_string 的输出写入 Ruby 端的文件,并在 Java 上读取该文件,它似乎工作正常

f = File.open("data.dat", "wb")
f << person.serialize_to_string
f.close

关于java - 如何在 Ruby 和 Java 之间序列化/解析 protobuf 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32105151/

相关文章:

java - 如何找到在字符串中至少出现两次且不重叠的任意两个字母对

javascript - 当部分包含 Rails 辅助方法(例如 link_to)时,为什么插入 <div><%= render 'my_partial' %></div> w/Coffeescript 会引发错误?

rabbitmq - 处理rabbitmq RPC模型中的异常-PHP

Java - 从Socket读取文件(while循环永远不会结束)

java - 在eclipse中添加包到svn ignore

java - 在java中分配一个字符串“值

python - 错误消息 'No handlers could be found for logger "multiprocessing"' 使用 Celery

java - 如何从字符串数组或数组列表创建一个字符串?

ruby - 为什么这个朴素的素数算法会失败?

c - 无法通过 RabbitMQ C master 发送图像