java - 使用带有 GTFS 数据的协议缓冲区时无法克服“无效的线路类型”
问题描述
我正在尝试使用 Google 的 GTFS 数据,但在尝试解析从 GTFS api 下载的流时出现此错误
这是设置:
- 我下载了“gtfs.proto”文件,该文件应从此处https://developers.google.com/transit/gtfs-realtime/gtfs-realtime-proto定义实时公交提要数据的消息类
你可以用记事本打开这个文件,它说它是2.0版
- 我从这里下载了一个 Windows 64 位预编译版本的 protoc: https ://repo1.maven.org/maven2/com/google/protobuf/protoc/2.5.0/
我运行下载的可执行文件,它生成一个以后可以使用的 java 包,方法是提供我下载的 proto 文件,如下所示:
protoc-2.5.0-windows-x86_64.exe --proto_path=. --java_out=. gtfs.proto
我启动了一个 Java 项目,并包含了上一步生成的包,并且..
我从 Maven 存储库下载了 protobuf 2.5 版运行时 java 库 - 这里:https ://mvnrepository.com/artifact/com.google.protobuf/protobuf-java/2.5.0
我将此运行时库包含在我的项目中
我进行了一个 REST 调用(使用不同的技术)以从我想要连接的交通提供商那里获取数据流。我将此流放在 c:\temp\GTFSR.data 中,我将使用它作为源数据。
我构建了一个 main() 方法,旨在打开数据,并提取中转更新记录,如下所示:
import com.google.transit.realtime.GtfsRealtime.FeedEntity;
import com.google.transit.realtime.GtfsRealtime.FeedMessage;
import java.io.File;
import java.io.FileInputStream;
public class GtfsRealtimeExample {
public static void main(String[] args) throws Exception {
File file = new File("c:/temp/GTFSR.data");
FeedMessage feed = FeedMessage.parseFrom(new FileInputStream(file));
for (FeedEntity entity : feed.getEntityList()) {
if (entity.hasTripUpdate()) {
System.out.println(entity.getTripUpdate());
}
}
}
}
但是,当我运行它时,我得到了错误:
Exception in thread "main" com.google.protobuf.InvalidProtocolBufferException: Protocol message tag had invalid wire type.
at com.google.protobuf.InvalidProtocolBufferException.invalidWireType(InvalidProtocolBufferException.java:99)
at com.google.protobuf.UnknownFieldSet$Builder.mergeFieldFrom(UnknownFieldSet.java:498)
at com.google.protobuf.AbstractMessage$Builder.mergeFieldFrom(AbstractMessage.java:508)
at com.google.protobuf.GeneratedMessage$ExtendableMessage.parseUnknownField(GeneratedMessage.java:661)
at com.google.transit.realtime.GtfsRealtime$FeedHeader.<init>(GtfsRealtime.java:1234)
at com.google.transit.realtime.GtfsRealtime$FeedHeader.<init>(GtfsRealtime.java:1217)
at com.google.transit.realtime.GtfsRealtime$FeedHeader$1.parsePartialFrom(GtfsRealtime.java:1291)
at com.google.transit.realtime.GtfsRealtime$FeedHeader$1.parsePartialFrom(GtfsRealtime.java:1)
at com.google.protobuf.CodedInputStream.readMessage(CodedInputStream.java:309)
at com.google.transit.realtime.GtfsRealtime$FeedMessage.<init>(GtfsRealtime.java:154)
at com.google.transit.realtime.GtfsRealtime$FeedMessage.<init>(GtfsRealtime.java:126)
at com.google.transit.realtime.GtfsRealtime$FeedMessage$1.parsePartialFrom(GtfsRealtime.java:203)
at com.google.transit.realtime.GtfsRealtime$FeedMessage$1.parsePartialFrom(GtfsRealtime.java:1)
at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:200)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:217)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:223)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49)
at com.google.transit.realtime.GtfsRealtime$FeedMessage.parseFrom(GtfsRealtime.java:400)
at GtfsRealtimeExample.main(GtfsRealtimeExample.java:20)
我已经使用最新版本的 protoc(版本 3)和运行时库的相应 v3 进行了尝试,但得到了相同的结果。
我究竟做错了什么 ?!!
解决方案
推荐阅读
- arrays - Delphi - 隐式类型转换运算符不适用于方法参数
- html - 如何在 swift 4 中的 webview 中显示大量数据
- php - 如果我有使用 word 的 url,如何从 php 打开 doc 或 pdf 文件?
- asp.net-core - 如何在 ASP.NET Core 2.0 中使用 SpeechSynthesizer
- unity3d - 使用 api 23 以上的统一 android 在 pdf 查看器中打开 pdf 文件
- php - 我们如何计算记录数并在rest api中显示?
- java - 为什么 KeyEvent getRepeatCount 总是返回 0?
- python - 如何分别提取每列中的重复值?
- ios - 如何实现泛型协议,该协议具有使用关联类型的类型的功能?
- python-3.x - 如何删除有条件的行以匹配字符串值