8

現在、多くの (ネストされている場合もある) C (または C++ Plain Old Data) 構造体と配列を渡すコードがあります。

これらをGoogle protobufsとの間で変換したいと思います。これら 2 つの形式間で変換するコードを手動で作成することもできますが、そのようなコードを自動生成した方がエラーが発生しにくくなります。これを行う最善の方法は何ですか?(これは、メンバー変数の名前を反復処理するのに十分なイントロスペクションを備えた言語では簡単ですが、これは私たちが話している C++ コードです)

私が検討していることの 1 つは、C 構造体を解析してから .proto ファイルを吐き出す Python コードと、すべての型についてメンバーからメンバーへ (いずれかの方向で) コピーする C コードを作成することです。より良い方法...または、すでに生成できる別のIDLがあるかもしれません:

  1. ネストされたすべての型を含む .h ファイル
  2. 同等のものを含む .proto ファイル
  3. .proto ファイルが生成する C++ 構造体と .h ファイルで定義された構造体の間でいずれかの方向をコピーする関数を含む .c ファイル
4

3 に答える 3

0

この問題のすぐれた解決策が見つかりませんでした。解決策があれば教えてください。

Python で独自のものを作成する場合は、gdb の Python バインディングが役立つ場合があります。次に、シンボル テーブルを読み取り、指定されたファイルで定義されているすべての構造体を見つけ、すべての構造体メンバーを反復処理できます。次に<gdbtype>.strip_typedefs()、各メンバーのプリミティブ型を取得し、適切な protobuf 型に変換するために使用します。

これは、アーキテクチャ、コンパイラ フラグ、プリプロセッサ マクロなどに依存する型を処理するため、おそらくテキスト パーサーよりも安全です。

protobuf との間で変換するコードも構造体メンバーからメッセージ フィールドへの関係から生成できると思いますが、簡単ではないように思えます。

于 2016-11-28T18:41:12.570 に答える
0

プロトコル バッファは、 TextFormatを使用して ASCII 表現を解析することで構築できます。したがって、1 つのオプションは、dumpAsciiProtoBuf各構造体にメソッドを追加することです。このメソッドは、単純なフィールド (文字列、ブール値など) をダンプdumpAsciiProtoBufし、ネストされた構造体フィールドを再帰的に呼び出します。次に、連結された結果が、 TextFormatを使用して解析できる有効な ASCII プロトコル バッファであることを確認する必要があります。

ただし、これはパフォーマンスに影響を与える可能性があることに注意してください (ASCII 表現の解析にはコストがかかる可能性があるため)。ただし、これにより、別の言語でコンバーターを作成する手間が省けるため、便利なソリューションと思われます。

于 2012-10-25T20:22:00.550 に答える