Exception
A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 64. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles.
可能性のあるオブジェクトサイクルが検出されました。 これは、サイクルが原因であるか、オブジェクトの深さが最大許容深さ64よりも大きい場合に発生する可能性があります。サイクルをサポートするには、JsonSerializerOptionsでReferenceHandler.Preserveを使用することを検討してください。
Jsonシリアライズ
上記のExceptionは、JsonSerializer.Serialize() のパラメータに ReferenceHandler.Preserve を設定した JsonSerializerOptions を渡すことで解消します。
1 2 3 4 5 6 7 8 |
JsonSerializerOptions jsonSerializerOptions = new() { ReferenceHandler = ReferenceHandler.Preserve, WriteIndented = true }; var jsonString = JsonSerializer.Serialize(customer, jsonSerializerOptions); |
セッション変数
Asp.Net Core のセッション変数は、全てのデータをjson形式に変換して格納するので、複雑なModelクラスをセッション変数に格納しようとした場合も、上記のExceptionが発生することがある。
その場合は、ReferenceHandler.Preserve を指定した JsonSerializer.Serialize() で、Jsonシリアライズ/デシリアライズを介することで、複雑なModelクラスもセッション変数で扱えるようになります。
※Customer は複雑なModelクラスの定義例で、customer は Customer クラスのインスタンスです。
1 2 3 4 5 6 7 8 9 10 11 |
JsonSerializerOptions jsonSerializerOptions = new() { ReferenceHandler = ReferenceHandler.Preserve, WriteIndented = true }; var jsonString = JsonSerializer.Serialize(customer, jsonSerializerOptions); // セッション変数に値を入力 await _ProtectedSessionStore.SetAsync("SessionKeyMultiEntity", jsonString); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// セッション変数の値を出力 var result = await _ProtectedSessionStore.GetAsync<string>("SessionKeyMultiEntity"); if (result.Success) { JsonSerializerOptions jsonSerializerOptions = new() { ReferenceHandler = ReferenceHandler.Preserve, WriteIndented = true }; var customer = JsonSerializer.Deserialize<Customer>(result.Value, jsonSerializerOptions); } |
※このExceptionは、Startup.cs の ConfigureServices(IServiceCollection services) メソッドに下記を追加しても解消ません。
1 2 3 |
services.AddControllersWithViews().AddJsonOptions(o => o.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve); |
コメント