boost::serialization
簡単に言うとデータのシリアル化(直列化)を行うライブラリ。
データを文字列(一直線に並べる)に変換するイメージだと分かりやすいか。
ファイルに保存したり、ネットワークでデータのやり取りを行う際に利用します。
今回はデータをテキストファイルに書き込んでみました。
#include <string> #include <vector> #include <fstream> #include <boost/serialization/serialization.hpp> #include <boost/serialization/string.hpp> #include <boost/serialization/vector.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> struct creature{ std::string name_; int power_; int toughness_; creature() : power_(0), toughness_(0){} creature(const std::string& name, int power, int toughness) : name_(name), power_(power), toughness_(toughness){} private: // シリアル化の実装を行うコード friend class boost::serialization::access; template<typename Archive> void serialize(Archive& ar, unsigned int /* version */){ ar & name_; ar & power_; ar & toughness_; } }; int main(){ // ファイルに保存 { std::vector<creature> creatures; creatures.push_back( creature("甲鱗のワーム", 7, 6) ); creatures.push_back( creature("さまようもの", 1, 1) ); std::ofstream ofs("file.txt"); boost::archive::text_oarchive oa(ofs); oa << creatures; } // ファイルから読み込み { std::vector<creature> creatures; std::ifstream ifs("file.txt"); boost::archive::text_iarchive ia(ifs); ia >> creatures; assert( creatures[0].name_ == "甲鱗のワーム"); assert( creatures[0].power_ == 7); assert( creatures[0].toughness_ == 6); } return 0; }
file.txt の中身。
22 serialization::archive 7 0 0 2 0 0 0 12 甲鱗のワーム 7 6 12 さまようもの 1 1
シリアル化を行うクラスに serialize メンバ関数を追加して実装しています。
コードがさっぱりしてて分かりやすい読みやすい。
今回はテキストデータに書き込みましたが、バイナリやXMLにも対応しています。
文字列 → ネットワークのやり取り バイナリ → 大容量データ XML → 設定ファイル
って、感じで使い分けすれば分かりやすいかな。
お手軽にツールの設定とか、現在の状態を保存できるのは便利ですね。
ゲームだとバグが出た時の状態をそのままファイル保存出来ればデバッグがやりやすくなりそう。
あと boost::serialization を使うには、boost をコンパイルする必要があるので注意。
[boost]
ver 1.44.0
[参照]
http://www.kmonos.net/alang/boost/classes/serialization.html
http://hw001.gate01.com/eggplant/tcf/cpp/boost_serialization.html
プログラミングの魔導書(書籍)
追記:コードが助長だったので修正。