搜索协议缓冲区文件

时间:2014-04-06 14:40:50

标签: protocol-buffers

我是协议缓冲区的新手,我想知道是否有可能搜索协议缓冲区二进制文件并以结构化格式读取数据。例如,如果我的.proto文件中的消息有4个字段,我想序列化消息并将多个消息写入文件,然后搜索文件中的特定字段。如果我找到该字段,我想以与编写时相同的结构化格式回读该消息。协议缓冲区可以实现吗?如果可能,任何示例代码或示例将非常有用。谢谢

2 个答案:

答案 0 :(得分:0)

您应该将protobuf库视为一个序列化协议,而不是支持复杂操作(例如查询,索引,拾取特定数据)的一体化库。谷歌在protobuf的开源部分上有各种各样的库,但是它们不是作为开源发布的,因为它们与它们独特的基础设施相关联。话虽这么说,你想要的肯定是可能的,但你需要编写一些代码。

无论如何,你的一些要求是:

  1. 一个文件包含各种序列化二进制文件。
  2. 搜索每个序列化二进制文件中的特定字段并提取该块。
  3. 有几种方法可以实现它们。

    1. 最常用的串行读/写方式是该文件包含一系列[大小,类型,序列化输出]。也就是说,一个序列化输出总是以大小和类型(4/8字节或可变长度)为前缀,以帮助读取和解析。所以你只需重复这个过程:1)读取大小和类型,2)读取给定大小的二进制文件,3)解析给定类型4)转到1)。如果使用联合类型或一个文件共享相同类型,则可以跳过类型。你不能放大,因为无法知道输出的结束。如果您想随机读/写,则需要其他类型的数据结构。

    2. '搜索字段'在二进制文件中更棘手。一种方法是逐个读取/解析输出,并通过HasField()检查字段的存在。这是最明显,最缓慢而直接的方式。如果你想按编号搜索字段(例如,你想搜索'可选字符串email = 3;'),那么搜索二进制blob(如0x1A,字段编号3,线类型2),它不可能。在序列化二进制流中,字段信息仅保存为数字。没有确切的上下文(.proto方案或二进制文件的结构),单独的数字并不意味着什么。不能保证0x1A来自字段信息,或来自其他消息类型的字段信息,或实际数字26,或其他数字的一部分等。也就是说,您需要自己维护信息。您可以使用必要的信息创建另一个文件或数据库以获取特定消息(例如,给定字段的序列化输出的位置)。

    3. 长话短说,你问的问题超出了开源的protobuf库本身的作用,但你可以根据自己的要求编写它们。

答案 1 :(得分:0)

我希望,这就是你要找的东西: http://temk.github.io/protobuf-utils/

这是一个用于在protobuf文件中搜索的命令行实用程序。