[unity] Newtonsoft Json でシリアライズできる項目、できない項目

NewtonSoft Json for Unity をそこそこ大掛かりなクラスで使ってみたところ、いくつか使えないケースも確認できたので、情報を共有します。
また、JsonUtility でどのような動作になるのかも触れておきます。

Vector2

Newtonsoft Json(設定つき可能)

Vector3、Vector4、Quaternion なども同様ですが、以下のエラーが出てシリアライズできません。

JsonSerializationException: Self referencing loop detected for property 'normalized' with type 'UnityEngine.Vector2'.

プロパティの循環参照による問題なので、子供から親への参照を禁止すればシリアライズできるようになります。

string json =
    JsonConvert.SerializeObject(
        serializedClass,
        Formatting.Indented,
        new JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        }
    );

JsonUtility(〇)

特に設定の必要なくシリアライズ化されます。

Transform, RectTransform

Newtonsoft Json(×)

さすがに無理だろうと思ってシリアライズしたみましたが、やっぱりエラー。

NotSupportedException: rigidbody property has been deprecated

こういったクラスは、必要な値だけ(X, Y, Z とか)別に移して [JsonIgnore] した方がいいと思います。

JsonUtility(×)

なかったことにされます(シリアライズされず、エラーも表示されない)。

Image

Newtonsoft Json(×)

ついでにこんなのも試してみました。Unity が落ちました。
[JsonIgnore] で回避しましょう……。

JsonUtility(×)

こちらも、なかったことにされます(シリアライズされず、エラーも表示されない)。

まとめ

Vector についてはエラーが出ても、設定で乗り切れます!

RectTransform や Image をどうしてもシリアライズ化する必要がある……という場合は、その設計を見直した方がよさそうです。

たまーにデータのディープコピーで使いたくなるんですが、速度面も考慮して JsonUtility の方がいいかなと思ったりする。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA