如何在另一个"message"中解码具有"message"的协议缓冲区对象?



我在用Ruby编码Protocol Buffer对象并在Java中解码时遇到问题。

一方面,我有以下 .proto 文件:

package foo;
message Message {   
    message Stats {
        required string session = 1;
        required string client = 2;
        required string providerCode = 3;
        required string startTime = 4;
        required string endTime = 5;
        required string execTime = 6;
        required string serviceApi = 7;
        required string travelOperation = 8;
        required string serviceOperation = 9;
        required string errorCode = 10;
        required string providerHubStatus = 11;
    }
    required Stats stats = 1;
}

当我在 Ruby 中记录原型对象的内容(使用 .inspect 函数)时,值为:

#<Foo::Message stats=#<Foo::Message::Stats session="1888ddb0-4371-55af-92d2-a63436fa5509" client="log" providerCode="EMP" startTime="2016-03-09 15:06:36" endTime="2016-03-09 15:06:40" execTime="3873" serviceApi="hot" travelOperation="avail" serviceOperation="Disponibilidad" errorCode="\x30" providerHubStatus="OK">>

这个信息似乎是正确的。

当我尝试在 Java 中解码消息时,出现了问题,发生了以下错误:

com.google.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field.  This could mean either than the input has been truncated or that an embedded message misreported its own length.

另一方面,我使用以下 .proto 文件进行了测试:

package foo;
message Stats {
    required string session = 1;
    required string client = 2;
    required string providerCode = 3;
    required string startTime = 4;
    required string endTime = 5;
    required string execTime = 6;
    required string serviceApi = 7;
    required string travelOperation = 8;
    required string serviceOperation = 9;
    required string errorCode = 10;
    required string providerHubStatus = 11;
}

当我记录原型对象(message.inspect)的内容时,值为:

#<Foo::Stats session="1888ddb0-4371-55af-92d2-a63436fa5509" client="log" providerCode="EMP" startTime="2016-03-09 15:06:36" endTime="2016-03-09 15:06:40" execTime="3873" serviceApi="hot" travelOperation="avail" serviceOperation="Disponibilidad" errorCode="\x30" providerHubStatus="OK">

在这种情况下,消息似乎又是正确的,现在,解码进展顺利。


为什么如果我有一个独特的消息"统计",解码进展顺利,而当我在另一条消息中有一条消息时,解码出错?

我应该为第一种情况做一些特别的事情吗?

根据我的经验,我可以告诉你,Java方面没有什么特别的。

我在 protoc 表现良好的一个项目的pom.xml中具有以下依赖关系:

    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>2.5.0</version>
    </dependency>

调试的一个提示:protoc有一个命令行选项--decode允许测试二进制消息。要将问题固定在一侧,您应该尝试使用此反序列化消息。

编辑

在验证生产方(红宝石)的结果后,行为不端的潜在来源减少为:

  • 网络通信
  • 爪哇端
    • 错误的类/类版本(确保重新生成了反序列化程序代码)
    • protoc中的错误(不太可能,但有可能)

为了一个接一个地消除,我假设您尝试反序列化您已经使用磁盘protoc --decode ...测试过的明显格式良好的包。

注意:这些是二进制数据。您不得将其作为字符串处理。

最新更新