msgpack-c
https://github.com/msgpack/msgpack-c
how to install ?
(1) xcode in mac の場合
- msgpack-c 配下の include だけ含め プロジェクトファイルのてきとーな場所に追加
- xcode に drag & drop
- user header search path で msgpack-c 配下 を recrusive に 指定
- header をソースコード上で呼び出す時に、こんな感じでよびだす。
# define MSGPACK_DISABLE_LEGACY_NIL
# include "msgpack.hpp"
※ この #define が入ってないと、なんかエラーでる。cmake だったら -D で指定したほうがいいようなやつ。とりあえず。
(2) config.make in ubuntu の場合
- addonとか別ディレクトリにいれとく、msgpack-c をおいておく (正しいやり方なのかはわからない・・)
- config.make の中にこんな感じで、そのパスをかいてあげればおk
PROJECT_CFLAGS = -I$(OF_ROOT)/addons/msgpack-c/include
how to use ?
ここにのってる。
https://github.com/msgpack/msgpack-c/blob/master/QUICKSTART-CPP.md
ofBufferでクラスをやりとりする超シンプルなサンプルコード書いた。
# pragma once
# include "ofMain.h"
// lib
# define MSGPACK_DISABLE_LEGACY_NIL
# include "msgpack.hpp"
// https://github.com/msgpack/msgpack-c/blob/master/QUICKSTART-CPP.md
class myclass {
private:
public:
std::string m_str;
float m_x;
MSGPACK_DEFINE(m_str, m_x);
};
class ofApp : public ofBaseApp
{
public:
void setup()
{
// シリアライズ化したいデータ
std::vector<myclass> vec;
myclass m1;
m1.m_str = "test1";
m1.m_x = 1.23;
myclass m2;
m2.m_str = "test2";
m2.m_x = 4.56;
vec.push_back(m1);
vec.push_back(m2);
// シリアライズ化して、"data.bin"として保存する
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, vec);
ofBuffer buf;
buf.set(sbuf.data());
ofBufferToFile("data.bin", buf);
}
void keyPressed(int key)
{
switch(key)
{
case ' ':
parseFromBin();
break;
}
}
// バイナリ化されたファイルをデシリアライズして、もともとのクラスの値を使う
void parseFromBin()
{
ofBuffer buf = ofBufferFromFile("data.bin");
msgpack::object_handle oh =
msgpack::unpack(buf.getData(),buf.size());
msgpack::object obj = oh.get();
// you can convert object to myclass directly
std::vector<myclass> rvec;
obj.convert(rvec);
printf("\n----\n");
for(myclass v : rvec)
{
printf("%s \n", v.m_str.c_str());
printf("%f \n", v.m_x);
}
}
};