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);  | 
					
  
  
  
  

コメント