非抽象基类自定义JsonConverter引发栈溢出问题求助
解决System.Text.Json非抽象基类自定义转换器递归栈溢出问题
当基类标记了[JsonConverter(typeof(MyBaseClassConverter))]时,直接调用JsonSerializer.Deserialize<MyBaseClass>(ref reader, options)会再次触发自定义转换器,形成无限递归导致栈溢出。要解决这个问题,核心是在反序列化基类实例时,临时移除自定义转换器。
具体实现步骤
在自定义转换器的逻辑中,针对基类的反序列化分支,创建一个排除当前转换器的新JsonSerializerOptions实例,用这个新选项完成基类的反序列化:
string objectType = readerClone.GetString(); if (objectType == "TypeBase") { // 创建新的选项,移除当前的自定义转换器 var baseOnlyOptions = new JsonSerializerOptions(options); baseOnlyOptions.Converters.Remove(baseOnlyOptions.Converters.First(c => c is MyBaseClassConverter)); // 使用新选项反序列化基类,不会触发自定义转换器 return JsonSerializer.Deserialize<MyBaseClass>(ref reader, baseOnlyOptions); } else if(objectType == "TypeA") { return JsonSerializer.Deserialize<MyDerivedClassA>(ref reader, options); } else if (objectType == "TypeB") { return JsonSerializer.Deserialize<MyDerivedClassB>(ref reader, options); } else { throw new JsonException($"Invalid value {objectType} for ObjectType"); }
原理说明
- 派生类(
MyDerivedClassA/MyDerivedClassB)本身没有标记JsonConverter属性,调用JsonSerializer.Deserialize时会使用默认反序列化逻辑,不会触发自定义转换器,因此不存在递归问题。 - 基类的反序列化通过新的
JsonSerializerOptions排除了自定义转换器,转而使用默认逻辑处理,彻底避免了递归调用。
内容的提问来源于stack exchange,提问作者PaulH567
相关产品推荐
相关产品推荐

