我有一个抽象基类:
[JsonConverter(typeof(Converter))]
public abstract class TextComponent {
...
public bool Bold { get; set; }
public TextComponent[] Extra { get; set; }
...
}
还有更多继承自它的类。其中一门课是StringComponent
:
public sealed class StringComponent : TextComponent
{
public string Text { get; set; }
public StringComponent(string text)
{
Text = text;
}
}
Converter
,这是一个JsonConverter
应用于TextComponent
看起来像这样:
private sealed class Converter : JsonConverter
{
....
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
var tok = JToken.Load(reader);
switch (tok)
{
...
case JObject x:
var dic = (IDictionary<string, JToken>) x;
if (dic.ContainsKey("text")) return x.ToObject<StringComponent>();
...
...
}
}
...
public override bool CanConvert(Type objectType) => objectType == typeof(TextComponent);
}
问题:
var str = "{\"text\":\"hello world\"}";
var obj = JsonConvert.DeserializeObject<TextComponent>(str);
// this doesn't work either:
var obj = JsonConvert.DeserializeObject<StringComponent>(str);
这进入无限“循环”,最终导致StackOverflow
,因为调用时DeserializeObject<Stringcomponent>
or ToObject<StringComponent>
, the JsonConverter
基类(Converter
) 再次调用这些方法。这不是期望的行为。序列化派生类时,它们不应使用基类的JsonConverter
。如果你看CanConvert
的方法Converter
,我也只允许它TextComponent
仅适用于它的任何派生类。
那么我该如何解决这个问题呢?