web-dev-qa-db-ja.com

protobufメッセージを調べる-名前でフィールド値を取得する方法?

ゲッターを明示的に呼び出さずにprotobufメッセージ内のフィールドの値を確認する方法を見つけることができないようです。

メッセージマップ内に到達するために_Descriptors.FieldDescriptor_インスタンスを使用する例が見られますが、それらはイテレータベースであるか、フィールド番号によって駆動されます。

地図を入手したら:

_Map<Descriptors.FieldDescriptor, Object> allFields = myMsg.getAllFields();
_

フィールド_"fieldXyz"_の値を取得するにはどうすればよいですか?

私はmyMsg.getFieldXyz()を使用できることを知っていますが、これは体系的な方法では使用できません。

名前でフィールド値にアクセスする方法がない場合は、この選択の背後にある理由を教えてください。 protobufの「哲学」をまだ理解していないかもしれません:-)

16

Descriptors#findFieldByName(name)をお探しですか。あなたは以下で試すことができます:

FieldDescriptor fieldDescriptor = message.getDescriptorForType().findFieldByName("fieldXyz");
Object value = message.getField(fieldDescriptor);
19
Wilson

私はこれがJavaのタグが付けられていることを知っていますが、誰かがc ++で値を取得する方法を探している場合:(仮定:フィールド= FieldDescriptor * int32を含む)

    int32_t value = message_1.GetReflection()->GetInt32(message_1, field);

これを取得するにはしばらく時間がかかり、stackoverflow参照が見つからなかったため、追加しました。それが役に立てば幸い。ありがとう!

8
user5071787