使用 Protocol Buffers 检索带有字段描述符的父消息中的字段名称
Retrieve the field name in the parent message with a field descriptor using Protocol Buffers
是否可以使用 Google Protocol Buffers 检索字段 name (不是 字段类型)在 C++ 中使用描述符来处理父消息?
考虑以下最小示例:
message MessageHeader {
string addressee = 1;
}
message Message {
MessageHeader header = 1;
}
我想使用以下函数检索字符串 "header.addresse"
:
std::string createFieldQueryFrom(
const google::protobuf::FieldDescriptor* const descriptor)
{
// TODO(wolters): The descriptor for the containing FIELD is required. Is
// there a way to retrieve it?
//
// containing_descriptor->name() returns "Message", what I want is
// "header"!
const google::protobuf::Descriptor* containing_descriptor{
descriptor->containing_type()};
// TODO(wolters): Add recursion if able to get the actual attribute name of
// the containing FIELD.
return "";
}
- 这可能吗,或者
google::protobuf::FieldDescriptor
实例不提供完成该任务所需的信息?
- 如果 1. 的答案是否:这是否可能(如果可能,您能给我举个例子吗)?
FieldDescriptor::name()
(例如您的示例中的 descriptor->name()
)returns 字段名称。但是,这只是 "header" 或 "addressee",而不是像 "header.addressee".
这样的完整路径
无法从单个 FieldDescriptor
生成完整路径,因为它不包含足够的信息。类型 MessageHeader
可以在许多不同的地方使用(不仅仅是在 Message.header
中),因此仅给定 addressee
的描述符就无法判断您正在寻找哪个使用站点。
如果您想在遍历消息时跟踪字段的路径,则需要通过维护 stack<FieldDescirptor*>
或类似的方法手动完成。
是否可以使用 Google Protocol Buffers 检索字段 name (不是 字段类型)在 C++ 中使用描述符来处理父消息?
考虑以下最小示例:
message MessageHeader {
string addressee = 1;
}
message Message {
MessageHeader header = 1;
}
我想使用以下函数检索字符串 "header.addresse"
:
std::string createFieldQueryFrom(
const google::protobuf::FieldDescriptor* const descriptor)
{
// TODO(wolters): The descriptor for the containing FIELD is required. Is
// there a way to retrieve it?
//
// containing_descriptor->name() returns "Message", what I want is
// "header"!
const google::protobuf::Descriptor* containing_descriptor{
descriptor->containing_type()};
// TODO(wolters): Add recursion if able to get the actual attribute name of
// the containing FIELD.
return "";
}
- 这可能吗,或者
google::protobuf::FieldDescriptor
实例不提供完成该任务所需的信息? - 如果 1. 的答案是否:这是否可能(如果可能,您能给我举个例子吗)?
FieldDescriptor::name()
(例如您的示例中的 descriptor->name()
)returns 字段名称。但是,这只是 "header" 或 "addressee",而不是像 "header.addressee".
无法从单个 FieldDescriptor
生成完整路径,因为它不包含足够的信息。类型 MessageHeader
可以在许多不同的地方使用(不仅仅是在 Message.header
中),因此仅给定 addressee
的描述符就无法判断您正在寻找哪个使用站点。
如果您想在遍历消息时跟踪字段的路径,则需要通过维护 stack<FieldDescirptor*>
或类似的方法手动完成。