◇ ADD_SERIALIZE_METHODSとは?
シリアライズおよびアンシリアライズの機構をクラスや構造体に組み込むマクロです。READWRITEマクロを用いて上から順に並べていくだけです。ところでデータベースに対して読み書きするシリアライズ・アンシリアライズの場合には注意点があります。
1: 順番は厳守です。入れ替えるとデータが壊れます。
2: メンバの型を途中から変えるのは厳禁です。
3: 途中からデータ構造を変える場合はコードを場合分けする手法を活用します。
◇ 途中からデータ構造を変えられる利点
データ構造を最初に決定するプロセスは非常に悩ましいものです。あとから抜け落ちていた要素が出てくるものです。そこでreservedというメンバをよくみると思います。予約しておき後から利用するためのメンバになります。それでもその扱いは容易ではなくなるべくなら定義したくない変数です。そこでこのシリアライズという仕組みです。ADD_SERIALIZE_METHODの内容を自由に記述できますから後からメンバを乗せる柔軟な対応が可能になっております。実際に便利でこのデータ構造は他の用途でも活用するべきです。
◇ 新しい型はserialize.hにその変形手法……シリアライズ・アンシリアライズを書きます
どの型であってもコンパイラが自動的にコードを生成する訳ではありません。新しい型を定義したらserialize.hにシリアライズとアンシリアライズの方法を記述しなければなりません。これでエラーを出すとエラーの内容がわかりにくい(テンプレート系のあのエラー群です)ため注意が必要です。
◇ サンプルコード
class test { public: ADD_SERIALIZE_METHODS template <typename Stream, typename Operation> inline void SerializationOp(Stream &s, Operation ser_action) { READWRITE(n); READWRITE(str); READWRITE(v); } bool operator==(const test &obj) const { return n==obj.n && str==obj.str && v==obj.v; } test() : n(0) {} private: int n; std::string str; std::vector<std::string> v; }; void test2 { test obj; obj.n=8; obj.str="mike"; obj.v.emplace_back(std::string("neko")); CDataStream ssData; ::Serialize(ssData, obj); test obj2; ::Unserialize(ssData, obj2); assert(obj==obj2); }