protobuf3中使用optional做字段空值校验是否属于最佳实践?
关于Protobuf 3.15+ optional关键字用于业务必填字段校验的说明
你当前的用法是Protobuf 3场景下实现业务字段必填校验的标准最佳实践,不存在设计逻辑的误用,相关逻辑说明如下:
- Protobuf的字段修饰符已经拆分了两层独立逻辑
Protobuf官方早在proto3设计阶段就废弃了proto2中编码级别的required修饰符,核心原因是编码级强制校验会导致严重的向后兼容问题:如果后续迭代需要调整字段必填性,新旧版本的服务/客户端通信会直接出现序列化失败。现在的optional修饰符的核心作用是开启字段存在性追踪能力,和业务上是否必填没有直接绑定关系,所有需要区分「用户未传值」和「用户传了等于默认值的业务值」的场景,都需要加optional修饰才能使用hasXXX()方法做判断。 - 你对默认值的判断完全符合Protobuf的设计逻辑
proto3的隐式默认值设计(数值默认为0、字符串默认为空串等)本身就是为了简化不需要感知字段存在性的场景,对于默认值本身有业务含义的场景,隐式默认值确实无法满足空值校验需求,这也是3.15版本重新引入optional的核心原因。
落地建议
- 可以在Proto文件的字段注释中明确标注业务必填字段,降低客户端对接的理解成本
- 所有业务必填校验统一收口在服务端的参数校验层,不要散落在各处业务逻辑中,避免出现漏判
- 不要尝试使用proto2的
required修饰符实现业务必填要求,编码级的强制校验会为后续的业务迭代埋下兼容隐患
内容的提问来源于stack exchange,提问作者Ziqi Liu
相关产品推荐
相关产品推荐

