JSON.Net の [JsonConvert()] 属性での StackOverflowException のアドレス指定
クラスのシリアル化をフラット化するために JSON.Net 内の [JsonConvert()] 属性を利用すると、StackOverflowException
が発生する可能性があります。これは、JSON シリアル化プロセス中の無限再帰によって発生します。
これを回避するには、オーバーライドされた JsonConverter
メソッドを含むカスタム WriteJson
が必要です。 このメソッドは、シリアル化プロセスを適切に終了することを保証する必要があります。 ただし、このメソッドの作成は複雑になる可能性があり、null 許容型、値型、および JSON コンバーター属性を慎重に処理する必要があります。
堅牢なソリューションには、循環再帰を防ぐために各プロパティでシリアル化を検証することが含まれます。次のコードは、このアプローチを示しています。
<code class="language-csharp">public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (ReferenceEquals(value, null)) { writer.WriteNull(); return; } var contract = (JsonObjectContract)serializer .ContractResolver .ResolveContract(value.GetType()); writer.WriteStartObject(); foreach (var property in contract.Properties) { if (property.Ignored) continue; if (!ShouldSerialize(property, value)) continue; var propertyName = property.PropertyName; var propertyValue = property.ValueProvider.GetValue(value); writer.WritePropertyName(propertyName); if (property.Converter != null && property.Converter.CanWrite) { property.Converter.WriteJson(writer, propertyValue, serializer); } else { serializer.Serialize(writer, propertyValue); } } writer.WriteEndObject(); } private static bool ShouldSerialize(JsonProperty property, object instance) { return property.ShouldSerialize == null || property.ShouldSerialize(instance); }</code>
このコードは、null 値のチェック、無視されたプロパティのスキップ、カスタム コンバーター内での ShouldSerialize
ロジックの実装によって例外を効果的に防止し、それによって正しい JSON シリアル化を保証します。
以上がJSON.Net で JsonConvert 属性を使用するときに StackOverflowException を防ぐ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。