使用ParseDelimitedFromCodedInputStream从文件读取?



我有一个文件,其中包含多个protobuf消息,并且查找表告诉我哪个消息在文件中开始。消息写入时被分隔。

在c#中,我可以这样做

fileStream.Position = message_start_index;
ProtoMessage msg = ProtoMessage.Parser.ParseDelimitedFrom(fileStream);

和完成

对于c++,ParseDelimitedFromSerializeDelimitedTo函数最终被添加到库中,所以我很高兴不再需要手动处理分隔符了。

但是对于解析带分隔符的消息,只有ParseDelimitedFromZeroCopyStreamParseDelimitedFromCodedStream——它们都是google的一些特殊实现。

我如何得到一个标准的ifstreamistream在那里?

我试着传递它,转换它,寻找那些特殊流类型的构造函数来从普通流中读取,但找不到任何有效的,所以任何提示都很感激。

protobuf API大量使用继承,因此您不应该查看ZeroCopyInputStreamCodedInputStream的构造函数,而应该查找它们的子类。

您正在寻找的是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);

相关内容

  • 没有找到相关文章

最新更新