当前位置: 首页 > 知识库问答 >
问题:

在协议缓冲区文件中搜索

牟星火
2023-03-14

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

共有1个答案

杨俊茂
2023-03-14

您应该将protobuf库视为一个序列化协议,而不是一个支持复杂操作(如查询、索引、拾取特定数据)的多合一库。Google在protobuf的开源部分上有各种库来实现这些功能,但它们并不是以开源的形式发布的,因为它们与其独特的基础设施相关联。话虽如此,您想要的当然是可能的,但您需要编写一些代码

总之,您的一些要求是:

  1. 一个文件包含各种序列化二进制文件。
  2. 在每个序列化二进制中搜索特定字段并提取该块。

有几种方法可以实现这些目标。

>

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

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

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

  •  类似资料:
    • 根据示例代码https://developers.google.com/protocol-buffers/docs/cpptutorial,它们展示了如何解析二进制格式的原始文件。使用 我尝试删除文本格式的输入文件的,但在读取文件时仍然失败。我需要做什么才能读取文本格式的原始文件?

    • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

    • 我目前在我的protoc.exe.旁边有一个名为addressbook.proto的文件,我在生成. h和. cc文件时遇到了困难 然而,我得到以下回应 关于我可能做错了什么有什么建议吗?

    • 我的目标是用扩展名解析协议缓冲区文件。pb。一串在Mac上使用自制软件下载Protobuff。运行protoc--版本,并具有libprotoc 3.1.0版本。 但当我运行Python时,它会说找不到模块。我改变了主意。pb文件名到\u pb2。py并在Python脚本中导入模块。 我正在使用谷歌文档,但仍然没有任何运气。我在编译Protobuf时也遇到了问题。so文件通过Python。我只是无

    • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa

    • 我想知道关于源存储库(例如git),协议缓冲区的最佳实践是什么: 我是否必须只放置。是否允许使用源代码的任何人使用protoc编译器重新生成类代码?或者两者兼而有之是最好的做法。proto编译器生成的proto文件和源代码?