2009-08-19 10 views
2

東京キャビネット(C言語のオリジナルAPI)を使用するC++のシステムを構築しています。問題は、次のようなクラスを格納したいということです。東京キャビネットと可変サイズのC++オブジェクト

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

問題はベクトルと文字列の長さが可変であることです。東京キャビネットにvoid *(私のオブジェクト)を渡して保管できるようにするには、オブジェクトのサイズをバイト単位で渡さなければなりません。しかし、それは自明に行うことはできません。

オブジェクトのバイト数を調べるにはどうすればよいですか?東京キャビネットに可変長物を保管するための最良の方法は何ですか?

私はすでにシリアル化ライブラリを探しています。

ありがとうございました

答えて

9

あなたは移植性バイトの生のシーケンスとして非POD C++の構造体/クラスを扱うことはできません - 後者は事実上、それが実際に壊れることを保証するけれども、これは、関係なく、ポインタの使用またはstd::stringstd::vectorのです。最初にオブジェクトを一連の文字列にシリアル化する必要があります - 良い、フレキシブルなクロスプラットフォームシリアル化フレームワークのためにBoost.Serializationを提案します。

4

私はそれがそれより悪いと思います。ベクトルの実際の記憶域は、オブジェクトの残りの部分と連続するではありません。 std::vector<>は、ヒープ上の別々の割り当てでデータを保持しているので、必要に応じて展開できます。 C++とSTLを理解するAPIが必要です。

要するに、 これはうまくいきません。

+0

私はまたそれを恐れています。私はシリアル化ライブラリが必要だと思う。 –

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

はい、あなたがオブジェクトを殺菌し、私は東京の内閣データ値としての私のC++オブジェクトを格納するためにProtocol Buffersを使用内閣

0

にそれを置くために、ブーストのシリアル化またはいるProtobufを使用することをお勧めし思います。

プロトコルバッファでは、構造体を指定し、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はかなり高速です。

関連する問題