[unity]JsonConvert で HashSet のデシリアライズに失敗する

public class DataFlag
{
    public HashSet<string> Tags;
}

JsonConvert で上記クラスをデシリアライズした時、Unity Editor や Standalone ビルドでは動くけど、他のビルドでは動かないというケースに遭遇しました。このようなエラーが表示されます。

Value cannot be null.
Parameter name: method

この問題を回避する方法をいくつか調べてみました。

シリアライズは(なぜか)出来る。unity2022.3 + Newtonsoft.Json 3.2.1 で確認。

その1:デシリアライズ前におまじないコードを追加

IL2CPP が良かれと思って(HashSet<string> 関連の呼び出しを)消してしまうことがあるそうなので、消されないよう、使用していることを明示します。

Newtonsoft.Json.Utilities.AotHelper.EnsureList<string>();
T data = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(jsonText);

HashSet<string> であれば EnsureList<string>()HaseSet<int> であれば EnsureList<int>() を毎回、デシリアライズ前に呼び出します。

その2:Dictionary に変えてしまう

List や Dictionary は正しく動くんだから、Dictionary<string, int> に変更する、というのも回避方法としては悪くないように思います。(int の部分はゼロでも入れておきましょう)

List<string> への変更が一見正しい記述に見えますが、メンバーが多くなるとパフォーマンスに問題が出てしまうため、止めておいた方が無難です。

そもそも HashSet 使った事がない Unity Programmer、多いかも。

詳しい情報

こちらの _TheFuture_ さんの投稿を参考にしました。

返信を残す

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

CAPTCHA