当前位置: 首页 > 知识库问答 >
问题:

停止协议缓冲区中默认值的遗漏

冯宏浚
2023-03-14

我有一个如下定义的原型模式,

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

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

如何实现这一点并避免在上述场景中省略这些字段?

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


共有2个答案

郗福
2023-03-14

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

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

公孙栋
2023-03-14
匿名用户

更新:最近通过可选关键字的新含义重新引入了存在跟踪信息原型3,这一点发生了变化:

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

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

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

这将需要与protobufbool相同的空间,但不兼容二进制文件,因此您不能简单地更改现有消息上声明的成员类型。好吧,我想如果你设为true===1,那么至少这仍然有效-对于转换,你必须预测false/not-specified是不明确的,直到你刷新了所有旧数据。

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

 类似资料:
  • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

  • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa

  • 两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?

  • 在阅读这个相当长的问题之前,我提出了一个bughttps://github.com/GoogleCloudPlatform/python-docs-samples/issues/1103. 原型包和名称解析的留档状态 您可以使用其他定义。通过导入原始文件。导入另一个。在proto的定义中,您可以在文件的顶部添加一条import语句。 我的依赖于annotations.proto将HTTP/JSON

  • 请注意:虽然这个问题特别提到了Dropwizard,但我相信任何有泽西/JAX-RS经验的人都应该能够回答这个问题,因为我可以想象Dropwizard只是在幕后遵循泽西/JAX-RS约定。 我有一个Dropwizard服务,它用JSON编写,工作非常出色。 现在我想将其切换为读/写二进制数据(以最小化网络带宽)。我看到了Dropwizard Protobuf库,但我对在Dropwizard中实现二

  • 我试图安装Caffe库,但我有一个编译问题,由于一个错误的原型版本安装在我的系统。 我在论坛上遵循了许多提议的方法,我认为在这篇帖子中讨论了最类似的问题。 在caffe.pb.h中控件是: 但是在我的系统标头(/usr/include/google/cript buf/stubs/Common. h)中: 命令protoc--version从终端返回libprotoc 3.2.0。 所以我安装了3