如何使用"消息"解码协议缓冲区对象?在另一条"消息中#34;?

时间:2016-03-09 15:44:27

标签: java ruby protocol-buffers

我在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中记录proto对象的内容时(使用函数.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;
}

当我记录proto对象的内容(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">

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

为什么我有一个独特的消息&#34;统计&#34;解码进展顺利,当我在另一条消息中有消息时解码出错了?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

修改

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

  • 网络通讯
  • Java方面
    • 错误的类/类版本(确保重新生成反序列化代码)
    • protoc中的错误(非常不太可能,但可能)

要一个接一个地使用,我想你会尝试反序列化已经用磁盘protoc --decode ...测试过的格式良好的软件包。

注意:这些是二进制数据。你不能把它当作字符串处理。