web-dev-qa-db-fra.com

Examen d'un message protobuf - comment obtenir les valeurs de champ par nom?

Il me semble impossible de trouver un moyen de vérifier la valeur d'un champ à l'intérieur d'un message protobuf sans invoquer explicitement son getter.

Je vois des exemples autour qui utilisent des instances de Descriptors.FieldDescriptor Pour atteindre l'intérieur de la mappe de messages, mais elles sont basées sur un itérateur ou pilotées par le numéro de champ.

Une fois que j'ai la carte:

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

comment puis-je obtenir la valeur du champ "fieldXyz"?

Je sais que je peux utiliser myMsg.getFieldXyz(), mais ce n'est pas utilisable de manière systématique.

S'il n'y a aucun moyen d'accéder aux valeurs des champs par leurs noms, j'aimerais savoir quelle est la justification de ce choix. J'ai peut-être encore à comprendre la "philosophie" du protobuf :-)

16
Marco Faustinelli

Je ne suis pas sûr que vous recherchiez Descriptors#findFieldByName(name). Vous pouvez essayer avec les éléments suivants:

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

Je sais que cela est balisé pour Java mais au cas où quiconque cherche un moyen d'obtenir la valeur en c ++: (en supposant: field = FieldDescriptor * qui contient un int32)

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

Il m'a fallu un certain temps pour l'obtenir et je n'ai trouvé aucune référence de stackoverflow, ce qui l'ajoute. J'espère que ça aide. Merci!

8
user5071787