原型错误:协议消息标签的导线类型无效

2022-09-03 12:39:18

我在尝试在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());
}

我在以下位置遇到异常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)

示例_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
    }
  }
}

它是按照.proto文件

谢谢


答案 1

我非常怀疑你是否在那里得到例外 - 我希望你能把它弄进去。您能否发布完整的堆栈跟踪,而不仅仅是前三行?parseFrom

我强烈怀疑你基本上有一个破碎的文件。事实上,你已经给出了一个扩展名,应该是一个二进制文件,这有点可疑......文件的实际外观如何?您不会像这样来解析原型语音消息的 ASCII 表示形式。.txtparseFrom

编辑:根据评论中链接的问题,您正在尝试使用为二进制数据设计的方法解析文本文件。

您希望使用如下内容:

// 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();

答案 2

当我看到用户报告此类消息时,几乎总是意味着他们已经损坏了文件。从 a 开始是一个令人担忧的迹象,因为协议缓冲区是一种二进制格式,不能用文本编码表示(除非你计算 base-64 等)。.txt

造成这种情况的另一个常见原因是用较少的数据覆盖文件,而不是修剪多余的数据。由于协议缓冲区(对于根消息)既不包含长度前缀也不包含终止符,因此将处理先前文件内容中的任何多余数据(现在基本上是垃圾数据)。这是一件坏事。在覆盖时,必须始终修剪输出。


推荐