【问题标题】:Proto3 setting value equal to default is not recognised in runtime运行时无法识别等于默认值的 Proto3 设置值
【发布时间】:2016-05-25 10:09:10
【问题描述】:

Proto3 没有Proto2 严格,并且没有requiredoptional 字段,没有自定义default 值。

鉴于以下定义...

message Order {
    enum Side {
        BID = 0;
        ASK = 1;
    }

    int64 time = 1;
    double price = 2;
    double volume = 3;
    Side side = 4;
}

这些字段中的任何一个都有默认值,毕竟现在在.build()您的对象之前,您必须或不能提供什么没有规则。

所以time 的默认值为0price0.0sideBID,如果您打印一个实例,其中您没有提供字段之一或提供默认值 然后运行时会将其视为在这两种情况下都从未提供过,因此无法确定该值是手动设置为BID 还是被视为默认值。

例如,如果我们执行以下代码(它的 kotlin)

Order.newBuilder()
        .setPrice(1.0)
        .setVolume(2.0)
        .setSide(Order.Side.BID)
        .build()
        .apply { println(this) }

我们会有这个输出

price: 1.0
volume: 2.0

至少这很烦人,因为当您使用标准 .toString() 或 json 打印机打印您的原型对象时,您将得到这样的裁剪输出...

{ "price": 1.0, "volume": 2.0 }
{ "price": 1.0, "volume": 2.0, "side": "ASK" }
{ "price": 1.0, "volume": 2.0 }
{ "price": 1.0, "volume": 2.0, "side": "ASK" }

但是,如果您的客户不一定关心默认值并希望所有字段都存在怎么办?

问题:有没有办法改变这种行为?至少我们如何确保如果设置了值,它会被显示?

也许有办法告诉protoc 生成不同的代码(影响默认行为)...

【问题讨论】:

  • 一个很好的问题。我经常使用proto2,但还没有研究过proto3,但这似乎是朝着我不满意的方向迈出的巨大一步。 requiredoptional、自定义 default 值以及检查某个值是否已设置或回退的可能性(hasValue()getValue())是我的许多应用程序中的一个主要构建块。跨度>

标签: java protocol-buffers kotlin proto3


【解决方案1】:

如果您想要 Proto2 的默认值和设置/取消设置行为,您应该切换回 Proto2。 Proto2 不太可能很快消失,因为许多代码(包括 Google 内部)仍然依赖于它,并且它与 Proto3 共享其大部分实现。将 proto2 与 proto3 视为一个选项(实际上是您正在寻找的确切选项),而不是版本更改。

【讨论】:

  • 我喜欢您将 proto2 和 proto3 的思维定式为风味选择而不是“升级”版本号。
猜你喜欢
  • 2020-09-24
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2016-06-11
  • 2020-01-27
相关资源
最近更新 更多