在 Protobuf 消息中引用任意字段的方法
Posted
技术标签:
【中文标题】在 Protobuf 消息中引用任意字段的方法【英文标题】:Way to Reference Arbitrary Field in Protobuf Message 【发布时间】:2018-09-26 20:14:18 【问题描述】:我正在寻找协议缓冲区消息中任意字段的字符串表示形式。有没有实现这个的库?我已经研究过使用字段掩码,但是它们对重复字段没有强大的支持。
【问题讨论】:
我不明白这个问题。可以举个例子吗? 当然。我希望能够用一些元数据注释消息中的任何字段。我为保存注释元数据定义了另一条消息,我想要一种方法来识别此注释适用于哪个字段。所以我正在为 protobufs 寻找类似 xpath 的东西。 我仍然建议在问题中添加一个示例(以及您的其他问题描述)。听起来协议缓冲区描述符是您所需要的,但我仍然不确定我是否正确理解了这个问题,而且我怀疑其他人也可能如此,因为还没有答案。 O:) 好的,让我分享一下我的问题描述。我正在使用存储在协议缓冲区中的配置数据。我想添加一个功能,可以将到期日期添加到任何字段。我的计划是向 proto 添加过期消息列表,其中包含过期日期和对哪个字段即将过期的引用。我会有一份将过期字段更新为其默认值的工作。希望这个描述能让问题更清楚。谢谢! :) 【参考方案1】:协议缓冲区消息和字段描述符通过名称提供字段访问。这允许您使用路径查找特定字段并删除它,如果这是您所要求的(如果不是,我建议扩展问题以包含您想要做的示例)。
一个对应的 Java 方法是 getDescriptorForType(返回类型是 message descriptor,您可以在其中找到字段描述符)。
C++ 有一个类似的描述符 API(在 Java 中,理论上您也可以使用反射)。
此 API 在轻量模式下不可用。
【讨论】:
感谢您的回答!这似乎会做我需要的。如果我正确理解 API,我将不得不对嵌套字段使用递归并为字段路径定义我自己的语法。这是字段路径的一些标准语法吗? 我参与的系统使用点作为路径分隔符。以上是关于在 Protobuf 消息中引用任意字段的方法的主要内容,如果未能解决你的问题,请参考以下文章