当使用GTFS数据的协议缓冲区时,java无法克服“无效导线类型”
我试图使用Google的GTFS数据,但在试图解析从GTFSAPI下载的流时出现此错误
以下是设置:
- 我下载了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中。数据,我将使用它作为源数据
我构建了一个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中尝试了这一点,但得到了相同的结果
我做错了什么
共 (0) 个答案