【问题标题】:How to serialize / parse protobuf object between Ruby and Java?如何在 Ruby 和 Java 之间序列化/解析 protobuf 对象?
【发布时间】:2015-08-19 20:33:09
【问题描述】:

在 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);
        } 

这是我看到的错误:

解析 protobuf 时出错:com.google.protobuf.InvalidProtocolBufferException:协议消息结束组标记与预期标记不匹配。 在 com.google.protobuf.InvalidProtocolBufferException.invalidEndTag(InvalidProtocolBufferException.java:94) [protobuf-java-2.6.1.jar:] 在 com.google.protobuf.CodedInputStream.checkLastTagWas(CodedInputStream.java:174) [protobuf-java-2.6.1.jar:] 在 com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:139) [protobuf-java-2.6.1.jar:] 在 com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:168) [protobuf-java-2.6.1.jar:] 在 com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:180) [protobuf-java-2.6.1.jar:] 在 com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:185) [protobuf-java-2.6.1.jar:] 在 com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49) [protobuf-java-2.6.1.jar:]

【问题讨论】:

    标签: java ruby rabbitmq protocol-buffers


    【解决方案1】:

    不清楚您是如何打包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
    

    【讨论】:

    • 谢谢!这与一个小改动一起工作,我最终使用了“protoRequest = ProtoRequest.parseFrom(Base64.decode(new String(message.getBody())));”在 java 方面,因为 message.getBody() 返回一个字节数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2014-12-09
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多