检查 protobuf 消息 - 如何按名称获取字段值?

Examining a protobuf message - how to get field values by name?

我似乎无法找到一种方法来验证 protobuf 消息中字段的值而不显式调用其 getter。

我看到使用 Descriptors.FieldDescriptor 实例到达消息映射内部的示例,但它们要么基于迭代器,要么由字段号驱动。

拿到地图后:

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

如何获取字段 "fieldXyz" 的值?

我知道我可以使用myMsg.getFieldXyz(),但是这不能以系统的方式使用。

如果无法通过名称访问字段值,我想知道这种选择背后的基本原理是什么。我可能还需要了解 protobuf "philosophy" :-)

我不确定您是否在寻找 Descriptors#findFieldByName(name)。您可以尝试以下方法:

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

我知道这是为 java 标记的,但万一有人正在寻找一种方法来获取 C++ 中的值:(假设:field = FieldDescriptor* 其中包含一个 int32)

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

我花了一段时间才得到这个,但没有找到任何 Whosebug 引用,因此添加了它。希望能帮助到你。谢谢!