我想制作一个包含多种不同事件类型的protobuf Event
消息。这是一个例子:
message Event {
required int32 event_id = 1;
oneof EventType {
FooEvent foo_event = 2;
BarEvent bar_event = 3;
BazEvent baz_event = 4;
}
}
这样做很好,但有一点让我感到困惑的是EventType
是可选的:我只能用event_id
编码一个对象,而protobuf不会抱怨。
>>> e = test_pb2.Event()
>>> e.IsInitialized()
False
>>> e.event_id = 1234
>>> e.IsInitialized()
True
有没有办法要求设置EventType
?如果重要的话,我正在使用Python。
答案 0 :(得分:10)
根据Protocol Buffers文档,不推荐required
字段规则,并且已在proto3中删除。
必需永远您应该非常小心地根据需要标记字段。如果您希望在某个时刻停止写入或发送必填字段,则将字段更改为可选字段会有问题 - 旧读者会认为没有此字段的邮件不完整,可能会无意中拒绝或丢弃它们。 您应该考虑为缓冲区编写特定于应用程序的自定义验证例程。谷歌的一些工程师得出的结论是,使用必需品弊大于利;他们更喜欢只使用可选和重复。但是,这种观点并不普遍。
正如上面的文档所述,您应该考虑使用特定于应用程序的验证,而不是将字段标记为required
。
无法将oneof
标记为"必需" (即使在proto2中)因为在oneof
被引入的时候,已经广泛接受的是,字段可能永远不应该是#34;所以设计师并没有打算实现一种方法来制作一个需要oneof
。