vac*_*ach 5 java protocol-buffers kotlin proto3
Proto3不像 那样严格Proto2,并且没有requiredoroptional字段,没有自定义default值。
鉴于以下定义...
message Order {
enum Side {
BID = 0;
ASK = 1;
}
int64 time = 1;
double price = 2;
double volume = 3;
Side side = 4;
}
Run Code Online (Sandbox Code Playgroud)
这些字段中的任何一个都有默认值,毕竟现在没有规则规定您在.build()对象之前必须或不可以提供什么。
time因此is 0、priceis0.0和sideis的默认值BID,如果您打印一个没有提供其中一个字段或提供默认值的实例,那么运行时会将其视为在这两种情况下从未提供过,因此无法确定是否该值是手动设置的BID或被视为默认值。
例如,如果我们执行以下代码(其 kotlin)
Order.newBuilder()
.setPrice(1.0)
.setVolume(2.0)
.setSide(Order.Side.BID)
.build()
.apply { println(this) }
Run Code Online (Sandbox Code Playgroud)
我们将得到这个输出
price: 1.0
volume: 2.0
Run Code Online (Sandbox Code Playgroud)
至少这很烦人,因为当您使用标准.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" }
Run Code Online (Sandbox Code Playgroud)
但是,如果您的客户不一定关心默认值并希望所有字段都存在怎么办?
问题:有没有办法改变这种行为?至少我们如何确保如果设置了值就会显示出来?
也许有一种方法可以告诉protoc生成不同的代码(影响默认行为)......
如果您想要 Proto2 的默认值和设置/取消设置行为,您应该切换回 Proto2。Proto2 不太可能很快消失,因为大量代码(包括 Google 内部)仍然依赖于它,并且它与 Proto3 共享大部分实现。将 proto2 与 proto3 视为一个选项(事实上,这正是您正在寻找的选项)而不是版本更改。
| 归档时间: |
|
| 查看次数: |
3022 次 |
| 最近记录: |