我在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;解码进展顺利,当我在另一条消息中有消息时解码出错了?
我应该为第一种情况做一些特别的事吗?
答案 0 :(得分:0)
根据我的经验,我可以告诉你,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 ...
测试过的格式良好的软件包。
注意:这些是二进制数据。你不能把它当作字符串处理。