Protobuf错误:协议消息标签的电线类型无效

问题描述

|| 尝试读取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());
}
我在ѭ1遇上例外 这是完整的堆栈跟踪。
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文件 谢谢     

解决方法

我非常怀疑您在这里遇到了例外-希望您能在
parseFrom
中得到它。您能发布完整的堆栈跟踪信息,而不只是前三行吗? 我强烈怀疑您的文件基本上已经损坏。您为二进制文件提供了ѭ5扩展名,这有点让人怀疑……该文件实际上是什么样的?您不必像这样使用ѭ4来解析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();
    ,当我看到用户报告此类消息时,几乎总是表示他们已损坏文件。从“ 5”开始是一个令人担忧的信号,因为协议缓冲区是一种二进制格式,无法以文本编码表示(除非您将base-64等数在内)。 造成这种情况的另一个常见原因是用较少的数据覆盖文件,而不修剪多余的文件。由于协议缓冲区(对于根消息)既不包含长度前缀也不包含终结符,因此将处理先前文件内容中的任何多余数据(现在基本上是垃圾)。这是一件坏事;覆盖时,您必须始终调整输出。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...