protocol-buffers - protobuf 中的 Oneof kind 与 Enum

标签 protocol-buffers proto

在 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 , countervalue一次。如果您设置另一个,这将清除其他字段。
假设一个 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/

相关文章:

go - Twirp 不适用于原型(prototype)

go - 什么时候使用嵌入?

objective-c - 如何使用 Objective C/iOS 5 SDK 安装 Protocol Buffer ?

java - 在 Java 中将 json 转换为动态生成的 protobuf

rust - 在 rust 中使用 prost 和 tonic 时如何导入 .proto?

python - 使用 google/protobuf/empty.proto 在没有参数的情况下调用 python grpc 方法期间出现 TypeError

Java、gRPC 和上下文传播

protocol-buffers - 使用基于 Java 的 Grpc 服务器和基于 C# 的客户端时传输失败错误

java - Android 和 Protobuf

Java:Protobuf字节到Json字符串到Pojo快速