在protobuf中需要`oneof`?

Mar*_*ase 3 python protocol-buffers

我想制作一个Event可以包含几种不同事件类型的protobuf 消息.这是一个例子:

message Event {
    required int32 event_id = 1;

    oneof EventType {
        FooEvent foo_event = 2;
        BarEvent bar_event = 3;
        BazEvent baz_event = 4;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但有一点让我感到困惑的是,这EventType是可选的:我只能编码一个对象,event_id而protobuf不会抱怨.

>>> e = test_pb2.Event()
>>> e.IsInitialized()
False
>>> e.event_id = 1234
>>> e.IsInitialized()
True
Run Code Online (Sandbox Code Playgroud)

有没有办法要求EventType设置?如果重要的话,我正在使用Python.

小智 12

根据Protocol Buffers文档,required不建议使用字段规则,并且已在proto3中删除了该字段规则.

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

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

没有办法将其标记oneof为"必需"(即使在proto2中),因为在oneof引入的时候,已经广泛接受的是,字段可能永远不应该是"必需的",因此设计人员不打算实施制作方法一个oneof必需的.

  • IMO 这是一个很好的答案,不应该被否决。我添加了一段将其与“oneof”联系起来,以防这是投反对票的原因。 (2认同)