2011-07-26 59 views
14

如何使用協議緩衝區存儲雙(1D)數組? 多維(2D或3D)密集陣列呢?協議緩衝區 - 存儲雙數組,1D,2D和3D

+0

可能重複[使用ProtoBuf-Net,如何(德)序列化多維數組?](http://stackoverflow.com/questions/4090173/using-protobuf-net-how-to-deserialize- a-multi-dimensional-array) –

+0

b1nary.atr0phy,這個問題有解決一維數組問題;這個問題也關於C/C++,而不是.NET。如果我們註冊我的問題爲重複,將答案合併? – osgx

回答

20

的雙陣列將通過

repeated double foo = 5 [packed=true]; 

repeated使得它充當一個列表,允許多個項目被最好存儲; packed避免每個項目的標題。

protobuf中沒有直接支持矩形(或更高)的數組。最近的是存儲類似於:

這大致類似於鋸齒陣列,但在每一層之間有一個元素。

+3

請將「大致類似鋸齒陣列」翻譯成更多編程英語? – osgx

+3

@osgx而不是「數組數組」,它更像是一個「數組對象,每個對象都有*數組」 - 更好? –

+0

是的。我應該將數組大小保存在其他字段中嗎? – osgx

20

人們可以簡單地模仿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將知道數據的長度,並且可以導出另一個值。

爲便於使用,人們可能會將C++中的Matrix與適配器類一起使用,該類允許通過double MatrixAdapter::get(int row, int col)訪問;它也可以驗證data_size()==rows()*cols()