特定のprotobufシリアル化からすべてのタグ番号を抽出できますか?

プロトタイプのシリアライゼーションがあれば、メッセージに含まれるすべてのタグ番号のリストを取得できますか?一般に、.protoファイルを定義しないでメッセージの構造を見ることは可能ですか?

2

2 答え

特定のメッセージに表示されるすべてのタグ番号を取得できますが、ネストされたメッセージは表示されません。また、そのフィールドのタイプ、可能なタイプのサブセットのみがわかりません。

ワイヤエンコーディングを見ると、(たとえば)バイト配列、文字列とネストされたメッセージはすべて同じ方法でエンコードされます。したがって、 "フィールド3は長さが接頭されたバイナリフィールドです"がわかるかもしれませんが、それはネストされたメッセージ、文字列またはバイトアレイ。

2
追加された

ほとんどのAPIは、生のprotobufストリームを列挙できるように、読者ベースのAPIの形式を持っています。しかし、スキーマなしの解釈があいまいなので、それだけではデータを完全に理解するには不十分です。

  • varintがジグザグでエンコードされている可能性があります( sint32 / sint64 )。そうでない場合( int32 / int64 >/ uint32 / uint64 ) - 意味を根本的に変更するか、ブール値または列挙型を変更する
  • 固定32 /固定64は、符号付きまたは符号なしの整数でも、IEEE754 float/double
  • 長さ接頭辞付きのチャンクは、UTF-8文字列、BLOB、サブメッセージ、またはパックされたプリミティブの繰り返しセットです。サブメッセージの場合、再帰的に繰り返す必要があります。

だから...はい、いいえ。確かに、最も外側のメッセージのフィールド番号を得ることができます。

別のアプローチは、メンバー Naked {} のメッセージ)を持つタイプに対して通常の APIを使用し、つまり、すべての実装が提供する「拡張」APIを介して)

2
追加された