2016-05-16 4 views
0

1.4.1をダウンロードし、WikiとGoogleで検索しましたが、何も見つかりませんでした。MsgpackでCスタイルの配列をパッキング/アンパック

データ型char、std :: string、ユーザー定義クラスを持つ配列をパック/アンパックできる方法はありますか?

char data[10]; 
std::string data2[10]; 
UserClass data3[20]; 

私はstd :: string配列に対して実行しようとしましたが、動作させることができませんでした。

私は自分のコードをboost :: serializationライブラリからMsgPackに移植しています。私はどんな助けにも感謝します。

ありがとうございます。&よろしくお願いします。 Owais。

+0

Cスタイルの配列をサポートするためにmsgpack-cにプルリクエストを投稿しました。 https://github.com/msgpack/msgpack-c/issues/465をご覧ください。 –

答えて

0

残念ながら、msgpack-cバージョン1.4.1には、Cスタイルの配列をパック/アンパックする機能はありません。唯一の例外はcharのC-Style配列です。これはSTR(https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str)として梱包されています。

多分あなたの期待した動作ではありません。

msgpack-cバージョン2.0は、pack/unpack Cスタイルの配列をサポートします。既にmaster支店でサポートされています。 http://melpon.org/wandbox/permlink/20WTgAATDhTX3rBA

のstd ::文字列の配列とUserClassの配列を指定できます作業の完全な例を参照してください

char data[10]; 
std::string data2[10]; 
UserClass data3[20]; 

https://github.com/msgpack/msgpack-c/pull/466

それは/パック以下の変数のすべてを解凍することができます参照してください。 msgpack::packmsgpack::object::convertに渡されます。それは簡単です。

// Packing 
std::stringstream ss; 
std::string data2[2] = { "ABC", "DEFG" }; 
msgpack::pack(ss, data2); // As ARRAY 

// Unpacking 
auto oh2 = msgpack::unpack(ss.str().data(), ss.str().size(), off); 

// Converting 
std::string c_data2[2]; 
oh2.get().convert(c_data2); 

しかし、charの配列はデフォルトとしてSTRとしてパックされています。 ARRAYとしてパックしたい場合は、msgpack::type::array_refを使用する必要があります。便宜上、msgpack::type::make_array_ref関数を用意してmsgpack::type::array_refを作成します。

std::stringstream ss; 
char data1[3] = { 'A', 'B', '\0' }; 

// Packing 
msgpack::pack(ss, msgpack::type::make_array_ref(data1)); // As ARRAY 

// Unpacking 
auto oh1_array = msgpack::unpack(ss.str().data(), ss.str().size(), off); 

// Converting 
char c_data1_array[3]; 
auto ar = msgpack::type::make_array_ref(c_data1_array); 
oh1_array.get().convert(ar); 

ここでは、C-Stype配列とmsgpackタイプの間のマッピングを示します。あなたがARRAYにchar[]unsigned char[]をマッピングしたいとき

char[]   : STR 
unsigned char[] : BIN 
T[]    : ARRAY (T means all other types.) 

だから、あなたはmsgpack::type::array_refを使用する必要があります。

関連する問題