我在用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 ...
测试过的明显格式良好的包。
注意:这些是二进制数据。您不得将其作为字符串处理。