我有一个文件,其中包含多个protobuf消息,并且查找表告诉我哪个消息在文件中开始。消息写入时被分隔。
在c#中,我可以这样做
fileStream.Position = message_start_index;
ProtoMessage msg = ProtoMessage.Parser.ParseDelimitedFrom(fileStream);
和完成
对于c++,ParseDelimitedFrom
和SerializeDelimitedTo
函数最终被添加到库中,所以我很高兴不再需要手动处理分隔符了。
但是对于解析带分隔符的消息,只有ParseDelimitedFromZeroCopyStream
和ParseDelimitedFromCodedStream
——它们都是google的一些特殊实现。
我如何得到一个标准的ifstream
或istream
在那里?
我试着传递它,转换它,寻找那些特殊流类型的构造函数来从普通流中读取,但找不到任何有效的,所以任何提示都很感激。
protobuf API大量使用继承,因此您不应该查看ZeroCopyInputStream
和CodedInputStream
的构造函数,而应该查找它们的子类。
您正在寻找的是google::protobuf::io::IstreamInputStream
,google::protobuf::io::ZeroCopyInputStream
的子类,适应std::istream
。
你可以这样使用:
std::ifstream my_file("path/to/file");
google::protobuf::io::IstreamInputStream zc_stream(&my_file);
ParseDelimitedFromZeroCopyStream(&msg, &zc_stream, nullptr);