考慮下面的序列化的類結構:JSON.NET甚至調用接口屬性getter時`ObjectCreationHandling`設置爲`Replace`
public class Foo
{
private IBar bar;
public IBar Bar
{
get
{
if(this.bar == null)
throw new InvalidOperationException("bar must be set before it is read");
return this.bar;
}
set
{
if(value == null)
throw new ArgumentNullException("value");
this.bar = value;
}
}
}
public interface IBar { }
public class Bar : IBar { }
而且下面的自定義JsonConverter確保IBar
被轉換爲Bar
:
Foo.Bar
吸氣
public class BarConverter : JsonConverter
{
public override bool CanWrite => false;
public override bool CanConvert(Type objectType)
{
return objectType == typeof(IBar);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jobject = JObject.Load(reader);
return jobject.ToObject(typeof(Bar), serializer);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotSupportedException("This should not be invoked.");
}
}
下面的代碼失敗
var settings = new JsonSerializerSettings
{
ObjectCreationHandling = ObjectCreationHandling.Replace,
Converters = { new BarConverter() }
};
JsonConvert.DeserializeObject<Foo>("{Bar: {}}", settings);
我的理解是ObjectCreationHandling.Replace
應該防止調用getter。事實上,如果我將Bar
屬性的類型更改爲具體的Bar
類而不是IBar
接口,那麼ObjectCreationHandling.Replace
工作得很好。
這是JSON.NET中的缺陷,還是有一個原因,聲明爲接口的屬性應忽略ObjectCreationHandling
值?
優秀的偵查。謝謝。 – StriplingWarrior
很高興我能幫到你。 –