protocol-buffers - 停止省略协议缓冲区中的默认值
问题描述
我有一个定义如下的原型模式,
message User {
int64 id = 1;
bool email_subscribed = 2;
bool sms_subscribed = 3;
}
现在根据官方proto3 文档,默认值不会序列化以在有线传输期间节省空间。但在我的情况下,我想接收客户端是否明确设置true/false
了字段email_subscribed/sms_subscribed
(因为这些值是true
以前的,但现在用户想要取消订阅)。因此,当客户端发送false
这些字段中的任何一个时,生成器代码序列化器只会忽略这些字段。
我如何实现这一点并避免在上述情况下省略这些字段?
PS:我使用 Javascript 作为我的 GRPC 客户端和 Python 和 GRPC 服务器。
解决方案
更新:最近通过optional
关键字的新含义重新引入了存在跟踪信息 proto3,这种情况发生了变化:
message User {
optional int64 id = 1;
optional bool email_subscribed = 2;
optional bool sms_subscribed = 3;
}
通过此更改(现在在 protoc 等中可用),即使它是隐式默认值,也会传输显式分配。
你不能在proto3下。您最好的选择可能是定义一个未指定的三布尔枚举作为第一个值为零的项目,然后是一些真/假值。
这将需要与protobuf相同的空间bool
,但不兼容二进制 - 因此您不能简单地更改现有消息上声明的成员类型。好吧,我想如果您设置为 true === 1,那么至少它仍然有效 - 对于过渡,您必须预料到 false / not specified 是模棱两可的,直到您刷新任何旧数据。
另一种选择是为 each 添加一个bool fooSpecified
成员bool foo
,但这会占用更多空间并且由于是手动的而容易出错。
推荐阅读
- caching - “缓存控制:公共”实际上有什么效果吗?
- flutter - 使 showModalBottomSheet() 高度根据内容调整
- flutter - 这里我的列表视图没有滚动飞镖颤振,请帮助我我是颤振新手
- javascript - 有人可以向我解释为什么这种语法使用括号而不是大括号,在 reduce 方法中添加逗号并且不再“返回”吗?
- excel - 求和公式在单独的 Evaluate 函数中工作,但不能组合
- python - 什么会导致迭代 PyTrend 关键字的此函数的范围列表索引?
- javascript - 确保没有选择两次随机 javascript 对象选择
- swift - 将非泛型 ObjC 类向上转换为 Swift 方法参数的父类
- r - 从定义范围 [min, max] 的泊松分布生成随机数
- php - 如何从数据库中获取更新的值而不是默认值?- Laravel,Mysql