Proto3
没有那么严格Proto2
,而且没有required
oroptional
字段,也没有自定义default
值。
给定以下定义...
message Order {
enum Side {
BID = 0;
ASK = 1;
}
int64 time = 1;
double price = 2;
double volume = 3;
Side side = 4;
}
这些字段中的任何一个都有默认值,毕竟现在没有规则规定您必须或不能在您.build()
的对象之前提供什么。
因此,time
is 0
,price
is0.0
和side
is的默认值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 打印机打印你的原型对象时,你会得到这个裁剪的输出......
{ "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
生成不同的代码(影响默认行为)......