在 protobuf3 中使用 Enum 和 oneof kind 有什么区别?据我所知,枚举将字段限制为预定义的一组值之一,但 oneof kind 也是如此。
最佳答案
枚举 是命名数字。您在枚举定义中定义名称并为其分配值。枚举应该始终具有它设置的值零。
enum State {
A = 0;
B = 1;
C = 2;
}
接下来,您可以在任何消息中使用此枚举message Update {
State currentState = 1;
State previousState = 2;
}
A 一个是非常不同的东西。它允许您发送不同的类型,但只为它们分配有限的内存。这是因为您一次只能设置其中一种类型。这类似于 union
在 C/C++ 或 std::variant
中从 C++17 开始。以这个例子为例,我们在 oneof 中定义了一条消息、一个整数和 double 值。
// The message in our oneof
message someMsg {
// Multiple fields
}
// The message holding our oneof
message msgWithOneof {
oneof theOneof {
someMsg msg = 1;
int32 counter = 2;
double value = 3;
}
// Feel free to add more fields her of before the oneof
}
您只能设置 msg
, counter
或 value
一次。如果您设置另一个,这将清除其他字段。假设一个 C/C++ 实现,最大的字段将决定分配的内存量。说
someMsg
是最大的,设置 integer 或 double 不会有问题,因为它们适合相同的空间。如果不使用其中一个,则分配的总内存将是 sizeof(someMsg) + sizeof(int32) + sizeof(double)
的总和.有一些开销来跟踪已设置的字段。在 google C++ 实现中,这有点存在于变量中。这类似于标记为可选的字段。
关于protocol-buffers - protobuf 中的 Oneof kind 与 Enum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69185020/