LoginSignup
0
1

More than 5 years have passed since last update.

msgpack-c を openFramworks で使う

Last updated at Posted at 2017-08-19

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

    }

};

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1