hamigaki::uuid::serialize()

だいぶ体調も回復したので、今日は少しコーディングできました。
action_game.exeのキャラクタ定義はBoost.Serializationを使って書き出そうと考えているので、hamigaki::uuidをBoost.Serializationに対応させました。
差分


最初に書いたコードはこうでした。

class uuid
{
    // ...

private:
    boost::array<boost::uint8_t,16> data_;

    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version)
    {
        ar & boost::serialization::make_nvp("data", data_.elems);
    }
};

ただ、これだとXMLで出力した際にdata_の各要素が<item>要素で表現されて冗長です。
いろいろ試した結果、結局こうなりました。

friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
    ar & boost::serialization::make_nvp(
        "data",
        boost::serialization::make_binary_object(data_.elems, 16)
    );
}

binary_objectを使うとtextまたはxmlアーカイバではBase64エンコードされて出力されるようです。
ただ、Base64だと何書いてあるか分からないので、できればBase16で出力して欲しいところです。
アーカイバがテキストかバイナリかでserialize()関数を切り分けられたら便利なんですけどね。
一応、アーカイバ毎にserialize()の特別バージョンを用意すれば切り分け可能なんですが、そのためにアーカイバクラスのヘッダを全部のインクルードするのはあんまりなのでやってません。