Edited at

msgpack-c を openFramworks で使う

More than 1 year has passed since last update.

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);
}

}

};