2012-10-25 21 views
5

現在、多くの(時にはネストされた)C(またはC++ Plain Old Data)構造体と配列を渡すコードがあります。Cの構造体(C++ POD)とGoogleのprotobufsの間の変換ですか?

これらをGoogleのprotobufsに/から変換したいと思います。私はこれらの2つのフォーマット間で変換するコードを手作業で書くことができましたが、そのようなコードを自動生成するのがエラーになりにくいでしょう。これを行う最善の方法は何ですか? (これはメンバ変数の名前を反復するのに十分なイントロスペクションを持つ言語では簡単ですが、これはC++コードです)

私が検討していることは、C構造体を解析するPythonコードを書くことです.protoファイルを吐き出して、すべての型のメンバ間で(どちらの方向でも)コピーするCコードを吐き出しますが、もっと良い方法があるかもしれません。既に生成可能な別のIDLがあります:.C Fiの同等物

  • を含むネストされたタイプのすべての
  • .protoファイルを含む

    1. .hファイルル.protoファイルが生成するC++の構造体と
  • 答えて

    0

    プロトコルバッファはTextFormatを使用してASCII表現を解析することによって構築することができる.hファイルで定義された構造体との間のいずれかの方向をコピーする機能を有します。だから、それぞれの構造体にメソッド "dumpAsciiProtoBuf"を追加することもできます。このメソッドは、単純なフィールド(文字列、boolなど)をダンプし、入れ子構造体のフィールドに対してdumpAsciiProtoBufを再帰的に呼び出します。連結結果がTextFormatを使用して解析できる有効なAsciiプロトコルバッファであることを確認する必要があります。

    ただし、これは(ASCII表現の解析が高価になる可能性があるため)パフォーマンスに影響を与える可能性があります。しかし、これはあなたに別の言葉でコンバータを書き込む手間を省くので、便利な解決策に思えます。

    +0

    返信いただきありがとうございます。私はC++クラスがそれ自身のメンバー変数を反復できるとは思いませんが、それは可能でしょうか?私は、ハードコーディングされた構造体フィールドを反復する複数のコードを維持する必要がないようにしようとしています。 –

    0

    この問題の解決策が見つからない場合は、私に教えてください!

    あなた自身をPythonでロールすることを決めた場合は、python bindings for gdbが便利かもしれません。その後、シンボルテーブルを読み込み、指定されたファイルに定義されているすべての構造体を見つけて、すべての構造体メンバを反復することができます。 次に、<gdbtype>.strip_typedefs()を使用して、各メンバーのプリミティブタイプを取得し、適切なprotobufタイプに変換します。

    それはアーキテクチャに依存タイプ、コンパイラフラグ、プリプロセッサマクロなど

    を処理するように、これは私がいるProtobufにしてから変換するコードもから生成される可能性を推測テキストパーサ、おそらく安全です構造体メンバをメッセージフィールドの関係に変換しますが、簡単には聞こえません。