检查 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 引用,因此添加了它。希望能帮助到你。谢谢!
我似乎无法找到一种方法来验证 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 引用,因此添加了它。希望能帮助到你。谢谢!