jav*_*Man 9 java protocol-buffers
尝试在java中读取消息时出现以下错误
Exception in thread "main" com.google.protobuf.InvalidProtocolBufferException: Protocol message tag had invalid wire type.
at com.google.protobuf.InvalidProtocolBufferException.invalidWireType(InvalidProtocolBufferException.java:78)
at com.google.protobuf.UnknownFieldSet$Builder.mergeFieldFrom(UnknownFieldSet.java:498)
at com.google.protobuf.GeneratedMessage$Builder.parseUnknownField(GeneratedMessage.java:438)
FileInputStream fis = new FileInputStream("F:/Newfolder/sample_message.txt");
Nt nlc = Nt.parseFrom(fis);
if(nlc.hasMessageId())
{
System.out.println("MessageId: "+nta2sse.getMessageId());
}
Run Code Online (Sandbox Code Playgroud)
我正在接受例外 if(nlc.hasMessageId())
这是完整的堆栈跟踪.
Exception in thread "main" com.google.protobuf.InvalidProtocolBufferException: Protocol message tag had invalid wire type.
at com.google.protobuf.InvalidProtocolBufferException.invalidWireType(InvalidProtocolBufferException.java:78)
at com.google.protobuf.UnknownFieldSet$Builder.mergeFieldFrom(UnknownFieldSet.java:498)
at com.google.protobuf.GeneratedMessage$Builder.parseUnknownField(GeneratedMessage.java:438)
at com.soeasy.aanta.nta.sse.NtaSse$Nta2Sse$Builder.mergeFrom(NtaSse.java:523)
at com.soeasy.aanta.nta.sse.NtaSse$Nta2Sse$Builder.mergeFrom(NtaSse.java:1)
at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:1)
at com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:212)
at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:746)
at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:1)
at com.google.protobuf.AbstractMessageLite$Builder.mergeDelimitedFrom(AbstractMessageLite.java:282)
at com.google.protobuf.AbstractMessage$Builder.mergeDelimitedFrom(AbstractMessage.java:760)
at com.google.protobuf.AbstractMessageLite$Builder.mergeDelimitedFrom(AbstractMessageLite.java:288)
at com.google.protobuf.AbstractMessage$Builder.mergeDelimitedFrom(AbstractMessage.java:752)
at com.soeasy.aanta.nta.sse.NtaSse$Nta2Sse.parseDelimitedFrom(NtaSse.java:338)
at com.soeasy.aanta.nta.sse.NtaSseServer.main(NtaSseServer.java:60)
Run Code Online (Sandbox Code Playgroud)
并且示例_message.txt具有以下内容:
message_id: 1
batch_meas_update {
device_update {
unique_device_id {
device_type: ME
device_id: 161
}
meas_update {
override_status: OVERRIDE_INACTIVE
bad_data_status: GOOD_DATA
scada_status: SCADA_ACTIVE
weight: 1.0
value: 406.596
}
}
}
Run Code Online (Sandbox Code Playgroud)
它符合.proto文件
谢谢
Jon*_*eet 18
我非常怀疑你在那里得到了例外 - 我希望你能得到它parseFrom.你能发布完整的堆栈跟踪而不仅仅是前三行吗?
我强烈怀疑你基本上是一个破碎的文件.事实上你已经给出了.txt应该是二进制文件的扩展,这有点令人怀疑......文件实际上是什么样的?您不要使用parseFrom这样的方法来解析protobuf消息的ASCII表示.
编辑:根据评论中链接的问题,您尝试使用为二进制数据设计的方法解析文本文件.
你想使用类似的东西:
// Use the normal try/finally for closing reliably
InputStreamReader reader = new InputStreamReader(fis, "ASCII");
Nt.Builder builder = Nt.newBuilder();
TextFormat.merge(reader, builder);
Nt nt = builder.build();
Run Code Online (Sandbox Code Playgroud)
当我看到用户报告此类消息时,几乎总是意味着他们损坏了文件。从 a 开始.txt是一个令人担忧的迹象,因为协议缓冲区是一种二进制格式,无法用文本编码表示(除非您计算 base-64 等)。
另一个常见的原因是覆盖数据较少的文件而不是修剪多余的数据。由于协议缓冲区(对于根消息)既不包括长度前缀也不包括终止符,因此将处理来自先前文件内容的任何多余数据(现在基本上是垃圾)。这是一件坏事;覆盖时,您必须始终修剪输出。
| 归档时间: |
|
| 查看次数: |
42224 次 |
| 最近记录: |