Protocol buffers 协议缓冲区:一个上下文中有效的压缩和重复的原语类型字段?
我有一个这样的结构:Protocol buffers 协议缓冲区:一个上下文中有效的压缩和重复的原语类型字段?,protocol-buffers,Protocol Buffers,我有一个这样的结构: message Entity { string name = 1; repeated double values = 2 [packed=true]; } message Entity { string name = 1; repeated EntityValues values = 2; } message EntityValues { oneof { string str
message Entity {
string name = 1;
repeated double values = 2 [packed=true];
}
message Entity {
string name = 1;
repeated EntityValues values = 2;
}
message EntityValues {
oneof {
string string_values = 1;
double double_values = 2;
}
}
message Entity {
string name = 1;
repeated EntityValues values = 2 [packed=true] (????);
}
message EntityValues {
oneof {
string string_values = 1;
double double_values = 2;
}
}
前面这个结构的问题是,我需要一个通用数组。我指的是不同类型的数组,比如说double
和string
所以我最终得到了这样一个结构:
message Entity {
string name = 1;
repeated double values = 2 [packed=true];
}
message Entity {
string name = 1;
repeated EntityValues values = 2;
}
message EntityValues {
oneof {
string string_values = 1;
double double_values = 2;
}
}
message Entity {
string name = 1;
repeated EntityValues values = 2 [packed=true] (????);
}
message EntityValues {
oneof {
string string_values = 1;
double double_values = 2;
}
}
但现在我担心的是,产生这种嵌套消息的开销(就大小而言),特别是对于大型数据集。所以最好是有这样的东西:
message Entity {
string name = 1;
repeated double values = 2 [packed=true];
}
message Entity {
string name = 1;
repeated EntityValues values = 2;
}
message EntityValues {
oneof {
string string_values = 1;
double double_values = 2;
}
}
message Entity {
string name = 1;
repeated EntityValues values = 2 [packed=true] (????);
}
message EntityValues {
oneof {
string string_values = 1;
double double_values = 2;
}
}
但正如文件所述,这是不可能的:
[…]在proto3中,默认情况下压缩标量数字类型的重复字段。[…]只有原语数字类型的重复字段才能声明为“压缩”[…]
所以我的问题是,如何在一个上下文中有有效的压缩和重复的基元类型字段?
为了回答这个问题,我尝试以下“嵌套proto”方法,使用多个proto文件:
entity.proto:
message Entity {
string name = 1;
string data_type = 2;
bytes array_data = 3;
}
repeatedstring.proto:
message RepeatedString {
repeated string myarray [packed=true] = 1;
}
repeateddouble.proto:
message RepeatedDouble {
repeated double myarray [packed=true] = 1;
}
正如您在本例中猜测的那样,array\u data
是一个包含其他proto序列化结构的字段,类似于在repeatedstring.proto
和repeateddouble.proto
文件中描述的结构
因为,我绝对需要的是确保我的原语类型数组被打包,以便用protobuf支持的每种语言高效地编码和解码巨大的数据集。因此,我最终采用了这种方法,使用了多个protobuf文件和嵌套的protobuf序列化
您认为我的方法有效吗?与包装在消息中的方法相比,有哪些缺点
在我的例子中,您知道更好的方法吗(最好是使用单个proto文件)
谢谢