2009-08-19 78 views
2

我正在用C++構建一個使用東京內閣(C中的原始API)的系統。問題是我想要存儲一個類如:東京內閣和可變大小的C++對象

class Entity { 
     public: 
     string entityName; 
     short type; 
     vector<another_struct> x; 
     vector<another_struct> y 
     vector<string> z; 
    }; 

問題是矢量和字符串具有可變長度。當我將一個void *(我的對象)傳遞給Tokyo Cabinet以便它可以存儲它時,我還必須以字節傳遞對象的大小。但這不可能輕易完成。

什麼是確定一個對象的字節數的最佳方法是什麼?或者什麼是在東京內閣存儲變長對象的最佳方式。

我已經在考慮尋找序列化庫。

謝謝

回答

9

您不能可移植治療非POD C++結構/類的字節的原始序列 - 這是不管用的指針或std::stringstd::vector的,儘管後者幾乎保證它會在實踐中突破。您需要首先將對象序列化爲一系列字符 - 我建議Boost.Serialization爲良好的,靈活的跨平臺序列化框架。

4

我認爲這比這更糟糕。矢量的實際存儲不是與對象的其餘部分連續。您看到std::vector<>將數據保存在堆上的單獨分配中(因此如果需要,它們可以擴展它們)。你需要一個理解C++和STL的API。

總之。 這不起作用。

+0

我也很害怕這個。我想我需要一個序列化庫。 – 2009-08-19 21:22:39

0

雖然我使用HDF5,但我遇到過類似的問題。在我的情況下,還有一個額外的要求,我可以讀取對象的子部分,所以序列化不是真正的選擇。

HDF非常像使用索引訪問數據的大型數組。我使用的解決方案是在存儲another_struct類型的表中添加一個「上一個索引」。

以你例如,如果「x」和「y」的已每3個2個元素,則該數據將被存儲如下:

[ index ] [ another_struct data here ] [ previous_index ] 
[ 0 ] [  x data 0   ] [ -1 ] 
[ 1 ] [  x data 1   ] [ 0 ] 
[ 2 ] [  x data 2   ] [ 1 ] 
[ 3 ] [  y data 0   ] [ -1 ] 
[ 4 ] [  y data 1   ] [ 3 ] 

然後,在主實體表,最後指數上漲存儲:

[ index ] [ Entity data here ] [ x ] [ y ] 
[ 0 ] [  ...  ] [ 2 ] [ 4 ] 

我不是那熟悉的東京內閣如何工作的,雖然這種方法應該工作,也未必是最佳的數據格式。理想情況下,如果您可以指向真正的東京內閣對象,那麼不是像上面那樣使用索引,而是可以存儲這些指針。

0

是的,你最好使用升壓序列化或protobuf的消毒對象,並把它放進櫥櫃

0

我用Protocol Buffers來存儲我的C++對象作爲東京內閣的數據值。

在協議緩衝區中,指定結構併爲C++,Python和Java生成編組/解組代碼。在你的情況下。原文件將如下所示:

message Entity { 
    optional string entityName = 1; 
    optional int32 type = 2; //protobuf has no short 
    short type = 3; 
    repeated AnotherStruct x = 4; 
    repeated AnotherStruct y = 5; 
    repeated string z = 6; 
}; 

特別是如果鹼存在在長的時間跨度中的數據,可更新的系統中,例如覆蓋新領域非常有價值。與XML和其他相比,protobuf非常快。

相關問題