Protobuf降级至3.12后oneof内string字段缺失has_str方法咨询
Protobuf 3.12与3.17版本oneof字段has方法生成差异原因
这个差异是proto3 optional特性从实验阶段到正式落地过程中,代码生成规则调整导致的:
- 版本特性成熟度差异
- 3.12版本的
--experimental_allow_proto3_optional参数对应的proto3可选字段功能还处于实验阶段,当时对oneof内部字段的公共API生成做了类型区分:仅子消息类型(比如示例中的Foo类型字段)会生成对外暴露的has_xxx()方法,标量、字符串等基础类型的oneof成员,仅保留内部使用的_internal_has_xxx()方法,不对外提供公共has接口。当时的设计逻辑是基础类型的oneof字段存在性,可以通过oneof对应的case枚举判断,不需要额外暴露has方法。 - 3.15版本proto3可选字段正式GA(正式发布)后,官方统一了oneof字段的API生成规则:无论oneof内部是基础类型还是子消息类型,全部生成公共
has_xxx()方法,保证API一致性,这个规则一直延续到3.17及后续版本。
- 3.12版本的
- 子消息类型has方法始终存在的原因
子消息类型的字段涉及到嵌套消息的内存管理、存在性语义判断,早在proto3 optional功能正式落地前,这类字段的has方法就默认对外暴露,不受实验阶段规则限制,因此两个版本下has_foo()都能正常生成。
3.12版本下判断oneof内
str字段是否设置,可以直接用oneof的case判断接口,写法为your_test_obj.value_case() == Test::kStr,这个接口在3.12和3.17版本中均稳定存在,跨版本兼容性更好。
内容的提问来源于stack exchange,提问作者Bob liao
相关产品推荐
相关产品推荐

