如何使用协议缓冲区存储双(1D)数组? 那么多维(2D或3D)密集阵列呢?
答案 0 :(得分:25)
可以简单地模仿C / C ++内存布局:
message DoubleMatrix {
required uint32 rows = 1;
required uint32 cols = 2;
repeated double data = 3 [packed=true];
}
要访问数据,请使用data[i*cols+j]
(行主要)或data[i+rows*j]
(列专用)。
对于方形矩阵,只需存储rows
/ cols
中的一个。从技术上讲,即使在矩形情况下,protobuf也会知道数据的长度,并且可以导出另一个值。
为了便于使用,可能会使用适配器类将Matrix包装在C ++中,该类允许通过double MatrixAdapter::get(int row, int col)
进行访问;它还可以验证data_size()==rows()*cols()
。
答案 1 :(得分:23)
最好通过
存储一个double数组repeated double foo = 5 [packed=true];
repeated
使其成为一个列表,允许多个项目; packed
避免了每个项目的标头。
protobuf中没有矩形(或更高)数组的直接支持。最接近的是存储类似的东西:
repeated innerType foo = 5; // note, can't be "packed"
message innerType {
repeated double foo = 1 [packed=true];
}
这大致类似于锯齿状数组,但每层之间都有一个元素。