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文件)

谢谢