如何序列化/解析 Ruby 和 Java 之间的 protobuf 对象?
How to serialize / parse protobuf object between Ruby and Java?
在 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
在 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