我正在为一个对象编写一个 proto3 类,该对象目前有大约 2 个变体,并且将增长到 6 或 7 个。其中只有一个会在消息中使用。这些变体不共享公共字段。它们将被编码为父消息中的子消息。这些消息将被写入一次并读取数万次。
我想知道什么是最高效的方式,内存和解析明智的时间,以实现这一点,以便随着更多变化的添加,性能不会丢失。
考虑以下变化。
message B1 {
repeated string value = 1;
bool hasMeta = 2;
}
message B2 {
repeated int32 value = 1;
map<string, string> foo = 2;
}
第一个选项:定义一个oneof
引用特定子类型的字段。
message P1 {
oneof parents {
B1 boo = 1;
B2 baz = 2;
// add more variations here in future..
}
// other non-related fields...
}
第二个选项:定义一个整数作为可用变体的标识符。在运行时,此整数可用于确定已设置哪个变体(另一种方法是对变体进行空值检查并使用第一个非空值)。
message P1 {
int32 type = 1;
B1 boo = 2;
B2 baz = 3;
// other non-related fields...
}
我对电线尺寸和性能特别感兴趣。
在第二个选项中,考虑到只设置一个变体(在应用程序层中强制执行),电线尺寸会比第一个更大吗?是否也为空字段保留内存?