Skip to content
lriki edited this page Jul 25, 2022 · 5 revisions

シリアライズ

Lumino では boost::serialization や cereal に似た方法で、オブジェクトのシリアライズを行うことができます。

基本的なサンプル

struct Unit {
    ln::String name; // 名前
    int hp;          // 体力
    int atk;         // 攻撃力

    void serialize(ln::Archive& ar) {
        ar & LN_NVP(name);
        ar & LN_NVP(hp);
        ar & LN_NVP(atk);
    }
};

JSON 文字列へシリアライズする

Unit unit { U"UnitA", 100, 42 };
ln::String json = ln::JsonSerializer::serialize(unit).unwrap();

結果は次のようになります。

{
    "name": "UnitA",
    "hp": 100,
    "atk": 42,
}

JSON 文字列からデシリアライズする

Unit unit;
ln::JsonSerializer::deserialize(json, &unit);

バージョン付け

struct Unit {
    ln::String name; // 名前
    int hp;          // 体力

    LN_SERIALIZE_VERSION(2)
    void serialize(ln::Archive& ar) {
        ar & LN_NVP(name);
        ar & LN_NVP(hp);
        if (ar.version() < 2) {
            // バージョンが 2 より前のデータを読み込んだ時の処理
        }
    }
};

保存・復元処理を分ける

struct Unit {
    ln::String name; // 名前
    int hp;          // 体力

    void serialize(ln::Archive& ar) {
        ar & LN_NVP(name);
        ar & LN_NVP(hp);
        if (ar.isSaving()) {
            // 保存時の処理
        }
        else {
            // 復元時の処理
        }
    }
};

エラー処理

serialize() 内で問題を見つけた場合、 SerializationException 例外を throw することでエラーを通知できます。

struct Unit {
    int hp;

    void serialize(ln::Archive& ar) {
        ar & LN_NVP(hp);
        if (hp < 0) {
            throw ln::SerializationException(U"error!");
        }
    }
};

Object の派生クラスのシリアライズ

class Unit : public ln::Object {
private:
    ln::String name; // 名前
    int hp;          // 体力
    int atk;         // 攻撃力

public:
    void serialize(ln::Archive& ar) override {
        ar & LN_NVP(name);
        ar & LN_NVP(hp);
        ar & LN_NVP(atk);
    }
};

JSON 文字列へシリアライズする

Ref<Unit> unit = makeObject<Unit>();
unit.name = U"UnitA";
unit.hp = 100;
unit.atk = 42;
ln::String json = ln::JsonSerializer::serialize(unit).unwrap();

JSON 文字列からデシリアライズする

Ref<Unit> unit = ln::JsonSerializer::deserialize<Unit>(json).unwrap();

Clone this wiki locally