gpt4 book ai didi

java - 运行时无法识别等于默认值的 Proto3 设置值

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:14:53 29 4
gpt4 key购买 nike

Proto3不像Proto2那样严格,没有requiredoptional字段,有没有自定义 默认 值。

给定以下定义...

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

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

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

所以time的默认值是0price0.0side > 是 BID,如果您打印一个实例,其中您没有提供其中一个字段或提供默认值,那么运行时将把它视为在这两种情况下从未提供过, 因此无法确定该值是手动设置为 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 打印机打印原型(prototype)对象时,您将得到裁剪后的输出...

{ "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 的默认值和设置/取消设置行为,您应该切换回 Proto2。 Proto2 不太可能很快消失,因为许多代码(包括谷歌内部)仍然依赖它,并且它与 Proto3 共享大部分实现。将 proto2 与 proto3 视为一个选项(实际上是您正在寻找的确切选项)而不是版本更改。

关于java - 运行时无法识别等于默认值的 Proto3 设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37433955/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com