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

时间:2016-06-28 09:03:53

标签: java protocol-buffers

我似乎无法在没有显式调用其getter的情况下找到验证protobuf消息中字段值的方法。

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

我有地图后:

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

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

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

如果没有办法按名字访问字段值,我想知道这个选择背后的理由是什么。我可能仍然需要了解protobuf“哲学”: - )

2 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:6)

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

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

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