Protocol buffers 在协议缓冲区文件中搜索

Protocol buffers 在协议缓冲区文件中搜索,protocol-buffers,Protocol Buffers,我不熟悉协议缓冲区,我想知道是否可以搜索协议缓冲区二进制文件并以结构化格式读取数据。例如,如果.proto文件中的一条消息有4个字段,我希望序列化该消息并将多条消息写入一个文件,然后搜索该文件中的特定字段。如果我找到该字段,我希望以与所写消息相同的结构化格式读回该消息。协议缓冲区是否可以实现这一点?如果可能,任何示例代码或示例都将非常有用。谢谢您应该将protobuf库视为一个序列化协议,而不是一个支持查询、索引、提取特定数据等复杂操作的多功能库。谷歌在protobuf的开源部分上有各种库,但它

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

您应该将protobuf库视为一个序列化协议,而不是一个支持查询、索引、提取特定数据等复杂操作的多功能库。谷歌在protobuf的开源部分上有各种库,但它们并不是作为开源发布的,因为它们与它们独特的基础设施紧密相连。也就是说,您想要的当然是可能的,但是您需要编写一些代码

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

一个文件包含各种序列化的二进制文件。 搜索每个序列化二进制文件中的特定字段并提取该块。 有几种方法可以实现这些目标

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

二进制文件中的“搜索字段”更复杂。一种方法是逐个读取/解析输出,并逐个检查字段的存在性。这是最明显、最缓慢但最直接的方法。如果您想按数字搜索字段,比如说,您想搜索“可选字符串email=3;”,因此,通过二进制blob(如0x1A、字段号3、导线类型2)进行搜索是不可能的。在序列化的二进制流中,字段信息仅保存一个数字。如果没有一个确切的context.proto方案或二进制文件的结构,这个数字本身并不意味着什么。不能保证0x1A来自字段信息,或者来自其他消息类型的字段信息,或者实际上是数字26,或者其他数字的一部分,等等。也就是说,您需要自己维护信息。您可以创建另一个文件或数据库,其中包含获取特定消息所需的信息,如给定字段的序列化输出位置


长话短说,您所要求的超出了开源protobuf库本身的功能,但您可以根据自己的需求编写它们。

我希望,这就是您想要的:


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

您使用的是什么平台/客户端库?有很多。答案取决于哪个。我计划使用C++原型Bufff编译器和C++原型BAPI。