停止在Protocol Buffers中省略默认值

时间:2018-05-02 07:42:29

标签: protocol-buffers grpc proto3 protobuf.js

我有一个如下定义的原型架构,

message User {
   int64 id = 1;
   bool email_subscribed = 2;
   bool sms_subscribed = 3;
}

现在根据官方proto3 documentation,默认值未被序列化以在有线传输期间节省空间。但在我的情况下,我想知道客户端是否已明确为字段true/false设置email_subscribed/sms_subscribed(因为之前的值为true,但现在用户想要取消订阅)。因此,当客户端为这些字段中的任何一个发送false时,生成器代码序列化器就会省略这些字段。

如何实现这一目标并避免在上述情况下遗漏这些字段?

PS:我使用Javascript作为我的GRPC客户端和Python和GRPC服务器。

1 个答案:

答案 0 :(得分:4)

你不能在proto3下。你最好的选择可能是定义一个没有指定的tri-bool枚举作为第一个值为零的项目,以及之后的一些真/假值。

这将需要与protobuf bool相同的空间,但不会与二进制兼容 - 因此您不能简单地更改现有消息上声明的成员类型。好吧,我想如果你真的=== 1,那么至少那仍然有效 - 对于过渡,你必须预测错误/没有指定是模棱两可的,直到你刷新了任何旧数据。 / p>

另一个选项是为每个bool fooSpecified添加一个bool foo成员,但这会占用更多空间,并且由于手动操作而容易出错。