找回密码
 立即注册
查看: 838|回复: 11

区分 Protobuf 中缺失值和默认值

[复制链接]
发表于 2021-11-14 21:59 | 显示全部楼层 |阅读模式
区分 Protobuf 中缺失值和默认值
发表于 2021-11-14 22:05 | 显示全部楼层
针对某些业务单个降级pb2 比较方便
发表于 2021-11-14 22:12 | 显示全部楼层
请教下:
“相关的字段打包成消息类型,由于不再是原始数据类型,比如 profit_rate_with_date,就可以用 hasXxx() 判断了;” 可否举个例子;
发表于 2021-11-14 22:21 | 显示全部楼层
protobuf3中也可以使用optional修饰词了
发表于 2021-11-14 22:27 | 显示全部楼层
“在 Protobuf 2 中,消息的字段可以加 required 和 optional 修饰符,也支持 default 修饰符指定默认值。默认配置下,一个 optional 字段如果没有设置,或者显式设置成了默认值,在序列化成二进制格式时,这个字段会被去掉,导致反序列化后,无法区分是当初没有设置还是设置成了默认值但序列化时被去掉了,即使 Protobuf 2 对于原始数据类型字段都有 hasXxx() 方法,在反序列化后,对于这个“缺失”字段,hasXxx() 总是 false——失去了其判定意义。”  

求这一段的出处,是否有问题?
发表于 2021-11-14 22:30 | 显示全部楼层
pb官网中关于pb2看不出特别明确的说法,很含糊。

github中protobuf组织的仓库里的关于字段是否存在的文档说的比较清楚,如果我没理解错的话。
protocolbuffers/protobuf “Presence in proto2 APIs”这一节。

其它能搜到的非官方回答
Do not set default values in optional protobuf fields to minimize data sent over the wire
how do has_field() methods relate to default values in protobuf?
发表于 2021-11-14 22:30 | 显示全部楼层
在 Protobuf 2 的 Java API 里有个设置,是否省掉设置的默认值,刚找了下,没找到了,也许新版去掉了?
发表于 2021-11-14 22:34 | 显示全部楼层
profit_rate用string类型不就可以了。没有值就是“”,有的话就是double转成字符串
发表于 2021-11-14 22:37 | 显示全部楼层
测试在C++ pb2中对整数填0,返序列化后hasXXX返true的
发表于 2021-11-14 22:40 | 显示全部楼层
https://stackoverflow.com/questions/31021797/protobuf-doesnt-serialize-default-values
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-25 03:31 , Processed in 0.116076 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表