简介
由于很多业务场景需要离线使用record数据包用于数据验证,所以离线解析record包输出为json,yaml,txt等文本文件就成了必然,基于cyberRT框架无此工具,所以此篇文章可以给出解决方案,源码经过验证,工程可实现.
方案
方案
-
使用pbFactory = apollo::cyber::message::ProtobufFactory::Instance();初始化
-
构造RecordReader(const std::string& file)对象recordReader
-
通过RecordReader的成员函数GetHeader().is_complete()判断下Header是否完整
-
如果完整通过recordReader->GetHeader()获得Header的引用header
-
然后通过调用header的成员函数begin_time()等获取header的内容
-
通过recordReader->GetChannelList()获取此离线数据包中的录制的通道名
-
通过totalMsgNum = recordReader->GetMessageNumber(channelName);获取相应channel在次离线数据包中的数量
-
auto& msgType = recordReader->GetMessageType(channelName);获取当前channel数据结构prorobuf的msgType
-
auto protoDesc = recordReader->GetProtoDesc(channelName);获取当前channel数据定义protobuf文件内容的描述符,用于protobuf反射机制获取元素键值;
-
pbFactory->RegisterMessage(protoDesc);
-
recordReader->ReadMessage()通过此函数获取离线数据包中Message查看当前数据段类型,包含channelname
-
通过google::protobuf::Message* rawMsgObj = nullptr;rawMsgObj = pbFactory->GenerateMessageByType(msgType);获得离线数据包中protobuf定义的原始数据,包含了元素键值对;
-
通过const google::protobuf::Descriptor及const google::protobuf::Reflection等反射机制解析离线数据包中rawMsgObj,解析完成后即可输出到json,txt,yaml等文件中;