Изучение сообщения protobuf - как получить значения полей по имени?

Кажется, я не могу найти способ проверить значение поля внутри сообщения protobuf без явного вызова его получателя.

Я вижу примеры вокруг, которые используют экземпляры Descriptors.FieldDescriptor для доступа к карте сообщений, но они либо основаны на итераторе, либо управляются номером поля.

Как только у меня есть карта:

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

как я могу получить значение поля "fieldXyz"?

Я знаю, что могу использовать myMsg.getFieldXyz(), но это невозможно использовать систематически.

Если нет способа получить доступ к значениям полей по их именам, я хотел бы знать, в чем причина этого выбора. Возможно, мне еще нужно понять философию протобуфа :-)

Ответы

Ответ 1

Я не уверен, что вы ищете Descriptors#findFieldByName(name). Вы можете попробовать следующее:

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

Ответ 2

Я знаю, что это помечено для java, но если кто-то ищет способ получить значение в c++: (здесь: поле FieldDescriptor *)

    if(field->cpp_type() == google::protobuf::FieldDescriptor::CPPTYPE_INT32) {
        int32_t value = message_1.GetReflection()->GetInt32(message_1, field);
    }

Мне потребовалось некоторое время, чтобы получить это, и не нашел ссылок на stackoverflow, поэтому добавив его. Надеюсь, поможет. Спасибо!