【问题标题】:Stopping omission of default values in Protocol Buffers停止省略协议缓冲区中的默认值
【发布时间】:2018-10-12 06:09:27
【问题描述】:

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

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

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

如何实现这一点,避免上述场景中这些字段的遗漏?

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

【问题讨论】:

  • 现在已经改变了;查看我的答案的更新

标签: protocol-buffers grpc proto3 protobuf.js


【解决方案1】:

更新:最近通过 optional 关键字的新含义重新引入了存在跟踪信息 proto3,这种情况发生了变化:

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

通过此更改(现在在 protoc 等中可用),即使它是隐式默认值,也会传输显式分配。


你不能在 proto3 下。您最好的选择可能是定义一个三布尔枚举,其中未指定为第一个值为 0 的项目,然后是一些真/假值。

这将需要与 protobuf bool 相同的 空格,但不兼容二进制 - 因此您不能简单地更改现有消息上声明的成员类型。好吧,我想如果你设置为 true === 1,那么至少它仍然有效 - 对于转换,你必须预料到 false / not specified 是模棱两可的,直到你刷新任何旧数据。

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

【讨论】:

  • 你能分享任何答案的例子吗?
  • @Vijendra 我可以做得比这更好...给我一秒钟...
【解决方案2】:

另一种选择是将wrappers 与proto3 一起使用。它们基本上将您的值包装在一条消息中,因此在父消息中它可以保留为空。

通过这种方式,您可以通过一些额外的工作来区分布尔字段上的 null / false / true。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 2021-12-19
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2016-12-19
    • 2011-10-27
    相关资源
    最近更新 更多