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_ さんの投稿を参考にしました。