1

私たちが使用しているいくつかの protobuf ベースのサービスのトラフィックについて、メッセージのデバッグを行いたいと考えています。

サービスはすべてメッセージ用にコンパイルされた .proto ファイルを使用します。メッセージの実際の形式を .proto ファイル テキストにシリアル化し、それをクライアントに送信して、クライアントがコンパイル時に実装の詳細を知る必要がないようにしたいと考えています。 .

これは C++ で可能ですか? definition なしでメッセージの構造を取得できることはわかっていますが、メッセージ フィールドの名前を持っていることはデバッグにとって重要です。.proto ファイルを使用せずにこの情報を取得する別の方法はありますか?

ありがとう!

4

1 に答える 1

2

元の送信者が.protoファイルを持っている場合、それらは「protoc」によって「descriptor.proto」(protobufのディストリビューションで利用可能であるはずです)と一致するprotobufデータファイルにコンパイルできます。あなたはを使用してこれを行うことができます

protoc --descriptor_set_out={out_path} --proto_path={in_path}

(または、必要に応じてstdoutするために、IIRC-テストされていません)

結果のバイナリデータはbytesフィールドとして含めることができ、クライアントがdescriptor.protoから生成されたオブジェクトモデルも持っている限り、個別に逆シリアル化できます。

デシリアライズした後の処理:FileDescriptorSet最上位オブジェクトです。FieldDescriptorProtoメンバー名などを持つ、までトラバースできるはずです。

おそらくあまりエレガントではありませんが、うまくいくはずです。

または、メタデータを任意の方法で含め、すべてを拡張フィールドとして扱います。

于 2012-06-27T21:17:08.033 に答える