【发布时间】:2016-05-25 10:09:10
【问题描述】:
Proto3 没有Proto2 严格,并且没有required 或optional 字段,没有自定义default 值。
鉴于以下定义...
message Order {
enum Side {
BID = 0;
ASK = 1;
}
int64 time = 1;
double price = 2;
double volume = 3;
Side side = 4;
}
这些字段中的任何一个都有默认值,毕竟现在在.build()您的对象之前,您必须或不能提供什么没有规则。
所以time 的默认值为0,price 为0.0 和side 为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 生成不同的代码(影响默认行为)...
【问题讨论】:
-
一个很好的问题。我经常使用
proto2,但还没有研究过proto3,但这似乎是朝着我不满意的方向迈出的巨大一步。required、optional、自定义default值以及检查某个值是否已设置或回退的可能性(hasValue()与getValue())是我的许多应用程序中的一个主要构建块。跨度>
标签: java protocol-buffers kotlin proto3