在protobuf中需要`oneof`?

时间:2017-03-22 15:10:38

标签: python protocol-buffers

我想制作一个包含多种不同事件类型的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。

1 个答案:

答案 0 :(得分:10)

根据Protocol Buffers文档,不推荐required字段规则,并且已在proto3中删除。

  

必需永远您应该非常小心地根据需要标记字段。如果您希望在某个时刻停止写入或发送必填字段,则将字段更改为可选字段会有问题 - 旧读者会认为没有此字段的邮件不完整,可能会无意中拒绝或丢弃它们。 您应该考虑为缓冲区编写特定于应用程序的自定义验证例程。谷歌的一些工程师得出的结论是,使用必需品弊大于利;他们更喜欢只使用可选和重复。但是,这种观点并不普遍。

正如上面的文档所述,您应该考虑使用特定于应用程序的验证,而不是将字段标记为required

无法将oneof标记为"必需" (即使在proto2中)因为在oneof被引入的时候,已经广泛接受的是,字段可能永远不应该是#34;所以设计师并没有打算实现一种方法来制作一个需要oneof