-
Notifications
You must be signed in to change notification settings - Fork 17
Core Serialize
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);
}
};Unit unit { U"UnitA", 100, 42 };
ln::String json = ln::JsonSerializer::serialize(unit).unwrap();結果は次のようになります。
{
"name": "UnitA",
"hp": 100,
"atk": 42,
}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!");
}
}
};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);
}
};Ref<Unit> unit = makeObject<Unit>();
unit.name = U"UnitA";
unit.hp = 100;
unit.atk = 42;
ln::String json = ln::JsonSerializer::serialize(unit).unwrap();Ref<Unit> unit = ln::JsonSerializer::deserialize<Unit>(json).unwrap();