簡體   English   中英

搜索協議緩沖區文件

[英]Searching through the protocol buffer file

我是協議緩沖區的新手,我想知道是否有可能搜索協議緩沖區二進制文件並以結構化格式讀取數據。 例如,如果我的.proto文件中的一條消息有4個字段,我想序列化該消息並將多條消息寫入一個文件,然后在文件中搜索特定的字段。 如果找到該字段,我想以與編寫時相同的結構化格式來讀取該消息。 協議緩沖區有可能嗎? 如果可能,任何示例代碼或示例都將非常有幫助。 謝謝

您應該將protobuf庫視為一種序列化協議,而不是支持復雜操作(例如查詢,索引,拾取特定數據)的多合一庫。 Google在protobuf的開源部分之上具有各種庫,但它們並未作為開源發布,因為它們與它們獨特的基礎結構緊密相關。 話雖如此,您想要的東西當然是可能的,但是您需要編寫一些代碼。

無論如何,您的一些要求是:

  1. 一個文件包含各種序列化的二進制文件。
  2. 在每個序列化的二進制文件中搜索特定字段並提取該塊。

有幾種方法可以實現它們。

  1. 串行讀/寫的最流行方法是文件包含一系列[大小,類型,序列化輸出]。 也就是說,一個序列化輸出始終以大小和類型(4/8字節或可變長度)為前綴,以幫助讀取和解析。 因此,您只需重復此過程:1)讀取大小和類型,2)讀取具有給定大小的二進制文件,3)解析給定類型的4)轉到1)。 如果使用聯合類型或一個文件共享相同類型,則可以跳過類型。 您無法刪除大小,因為無法獨自知道輸出的結束。 如果要隨機讀取/寫入,則需要其他類型的數據結構。

  2. 二進制文件中的“搜索字段”更為棘手。 一種方法是逐一讀取/解析輸出,並通過HasField()檢查字段的存在。 這是最明顯,最慢但最直接的方法。 如果要按編號搜索字段(例如,要搜索“可選字符串email = 3;”),因此要按二進制Blob(例如0x1A,字段編號3,導線類型2)進行搜索,則不可能。 在序列化的二進制流中,字段信息僅保存一個數字。 沒有確切的上下文(.proto方案或二進制文件的結構),僅此數字就沒有任何意義。 不能保證0x1A來自字段信息,或者來自其他消息類型的字段信息,或者實際上是數字26,或者是其他號碼的一部分,等等。也就是說,您需要自己維護該信息。 您可以使用必要的信息來創建另一個文件或數據庫,以獲取特定的消息(例如,具有給定字段的序列化輸出的位置)。

長話短說,您所要求的超出了開源protobuf庫本身的功能,但是您可以根據需要編寫它們。

我希望這是您要尋找的東西: http : //temk.github.io/protobuf-utils/

這是用於在protobuf文件中搜索的命令行實用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM