😎

[C++] MessagePack チュートリアル

2023/08/20に公開

はじめに

通信のシリアライズ/デシリアライズで使われるライブラリとして、
MessagePackに興味があったので、チュートリアルを参考に簡単なプログラムを試してみました。
試行内容は、単純にシリアライズ・デシリアライズを行ってみた、というものです。

準備

MessagePackは、以下のGithubから落としてきました。
https://github.com/msgpack/msgpack-c/tree/cpp_master

MessagePackはboostライブラリに依存しているため、boostライブラリも必要になります。
boostライブラリは以下からダウンロードします。
boostライブラリダウンロードサイト

上記2つをダウンロードし、解凍しておきます。
以上で、準備は終わります。

プロジェクト作成・コード追加

新規プロジェクトを作成し、準備した各種ライブラリのパスを設定します。

  1. 新規プロジェクト作成 > コンソールアプリ(C++)にて、プロジェクトを作成します。

  2. 各種ライブラリのパスを通します。
    プロジェクトのプロパティから、構成プロパティ > C/C++ > 全般を選択します。
    追加のインクルードディレクトリに、MessagePackとboostライブラリへのパスを追加します。
    MessagePack:[インストールディレクトリ]\msgpack-c-cpp_master\include
    boostライブラリ:[インストールディレクトリ]\boost_1_83_0

  3. ヘッダーファイルを追加します。

sample.h
#pragma once


#include <iostream>
#include <string>
#include <msgpack.hpp>


class MsgPackClientTest
{
public:
	MsgPackClientTest()
		: m_Number(0)
	{}


	MsgPackClientTest(int InNumber, std::string InText)
		: m_Number(InNumber)
	{}

	inline int GetNumber() const { return m_Number; }

	MSGPACK_DEFINE(m_Number);

private:
	int m_Number;
};

  1. cppファイルを書き換えます。
sample.cpp
#include "MsgPackClientTest.h"

using namespace msgpack;


void Serialize(sbuffer& buffer)
{
	//クライアントクラスのインスタンス化
	MsgPackClientTest TestClient;

	//シリアライズ
	pack(buffer, TestClient);

	//シリアライズ後データ
	char* dataptr = buffer.data();

	//シリアライズ後のデータサイズ
	size_t data_size = buffer.size();

	std::cout << "シリアライズデータサイズ: " << data_size << std::endl;
}

void Deserialize(sbuffer& buffer)
{
	MsgPackClientTest RestoreTestClient;

	try
	{
		char* pdata = buffer.data();
		size_t data_size = buffer.size();

		object_handle hd = unpack(pdata, data_size);
		const object& obj = hd.get();

		obj.convert(RestoreTestClient);
		std::cout << "デシリアライズデータ:" << RestoreTestClient.GetNumber() << std::endl;
	}
	catch (std::bad_cast&)
	{
		//例外処理

	}
}



int main()
{
	sbuffer buffer;

	Serialize(buffer);

	Deserialize(buffer);


	return 0;
}

実行

シリアライズデータサイズ: 2
デシリアライズデータ:0

実行すると、シリアライズ後のデータサイズと、
デシリアライズ後の復元したデータがログにでます。

最後に

簡単に、シリアライズ・デシリアライズを行うことができました。
以上、簡単なMessagePackチュートリアルでした。

Discussion