#include <boost/serialization/serialization.hpp>
#include <boost/serialization/vector.hpp> // std::vectorをシリアライズしたい場合必要
#include <boost/serialization/string.hpp> // std::stringをシリアライズしたい場合必要
using namespace std;
struct MyData
{
vector<string> vec;
int num;
double pi;
private: // ここがシリアライズ処理の実装
friend class boost::serialization::access;
template<class Archive>
void serialize( Archive& ar, unsigned int ver )
{
ar & vec;
ar & num;
ar & pi;
}
};
#include <fstream>
#include <boost/archive/text_oarchive.hpp> // テキスト形式アーカイブに書き込み
#include <boost/archive/text_iarchive.hpp> // テキスト形式アーカイブから読み込み
int main()
{
// 保存
{
MyData data;
data.num = 100;
data.pi = 3.14;
data.vec.push_back("Hello");
data.vec.push_back("World");
ofstream file("save.dat");
boost::archive::text_oarchive oa(file);
oa << (const MyData&) data;
}
// 復元
{
MyData data;
ifstream file("save.dat");
boost::archive::text_iarchive ia(file);
ia >> data;
}
}
オブジェクトをファイル等に保存するためにバイト列に直すことをシリアライゼーション(直列化) といいます。ファイルへの保存や、ネットワーク越しにオブジェクトをやりとりする時なんかに 重要になってきます。そんな直列化を担当するのがこのboost::serializationです。 保存したデータが環境依存にならないようにエンディアン他色々も考慮されてます。
基本型のシリアライズをするには、boost/serialization/serialization.hpp ヘッダを読み込みます。 STLのコンテナの場合、boost/serialization/コンテナ名.hpp です。独自のクラスや構造体の場合、 上のサンプルにあるようなserialize関数を定義して保存のしかたを定義します。 & 演算子を使って serialize 関数1個定義すると、セーブとロードの両方ができるようになってくれます。
実際にファイル等への読み書きをするには、text_iarchiveとtext_oarchiveクラスを使います。 名前の通りテキストで保存されます。バイナリで詰め込みたい場合にはbinary_(i|o)archiveクラスもあります。 ついでにxml_iarchiveクラスも。