如何使用protobuf的反射机制遍历所有已设置的FieldDescriptor*

本文介绍了在项目中如何使用protobuf的反射机制遍历所有已设置的FieldDescriptor。由于需要为不同Message的浮点数比较设置精度,作者在找不到现成代码的情况下,通过阅读API文档实现了这一功能。文章分享了实现方案,包括获取Message的所有FieldDescriptor的方法,特别是对Repeated字段的处理,以及在递归遍历中的注意事项。最后,提供了完整的实现代码供读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

在项目开发中,由于需要使用到一个protobuf的API, 用于对不同Message的比较过程中,设置浮点数比较精度的API,

MessageDifferencer::SetFractionAndMargin(const FieldDescriptor * field, double fraction, double margin),需要传入一个

Message的FieldDescriptor,而项目中想对所有的浮点型的Field都设置默认精度,那么,就有了遍历一个Message中的所有

FieldDescriptor的需求出来了。

实现方案

直接想在网上找代码片断,可惜了,百度和谷歌都没有谁有现成的代码出来,那就只能自己阅读API文档,做第一个贡献者吧。

自己调试了几个版本,终于算是把已知的一些问题都修复了,不排除还有一些未知的BUG,请大家指正。

主要使用的几个API,以及需要注意的问题。

1、如何获取当前Message的所有FieldDescriptor。

A)对于一个Message获取其下层的所有Field,可以通过Descriptor*获取,这个获取的是协议定义中的所有(无论是否被设置)

B)通过Relection中的ListFields去获取,这个是获取所有已设置的。(应该使用这个API)

2、对于Repeated的Field。通过Reflection的FieldSize去获取其Field的个数。

A)对于其类型是CPPTYPE_MESSAGE,需要进行递归遍历。

B)对于非CPPTYPE_MESSAGE,则直接返回,没有子层级的Field了。

这里直接上最终的实现代码,有类似需求的可以参考一下

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值