私の問題は、コンバーターがインターフェースの実装に適用され、プロパティタイプがインターフェースである場合、JsonConverter が json.net デシリアライゼーション プロセスによって呼び出されないように見えることです。TypeNameHandling = TypeNameHandling.Objects を使用して、json に $type を追加します。シリアライゼーションとデシリアライゼーションの両方でそうします。また、インターフェイスの実装であるプロパティがある場合、クラスのコンバーターが適切に呼び出されます。しかし、インターフェイス型のプロパティがある場合、具象クラスのコンバーターは呼び出されません。
このクラスを逆シリアル化すると、JsonDataBagCreationConverter は RealTelephone によって呼び出されますが、これはインターフェイスであるため、Telephone では呼び出されません。どちらも正しい $type でシリアル化されていますが。これにより、RealTelephone の .Data が満たされ、Telephones .Data が null になります。
[JsonConverter(typeof(JsonDataBagCreationConverter<ContainerForITelephone>))]
public class ContainerForITelephone : IDataBag
{
private object _data;
private DataBagTypeEnum _dataBagTypeEnum;
public ITelephone Telephone { get; set; }
public Telephone RealTelephone { get; set; }
public object Data
{
get { return _data; }
set { _data = value; }
}
public DataBagTypeEnum DataBagType_Enum
{
get { return _dataBagTypeEnum; }
}
}
この jsonconverter は Telephone プロパティに対して呼び出されません。ただし、これは RealTelephone 用です。
public class JsonDataBagCreationConverter<T> : JsonConverter where T : IDataBag, new()
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType != JsonToken.Null)
{
var jsonObject = JObject.Load(reader);
var target = Create(objectType, jsonObject);
serializer.Populate(jsonObject.CreateReader(), target);
((IDataBag)target).Data = jsonObject.ToString();
return target;
}
return null;
}
}
[JsonConverter(typeof(JsonDataBagCreationConverter<Telephone>))]
public class Telephone : ITelephone
{
public string Name { get; set; }
public string AreaCode { get; set; }
public string Number { get; set; }
public SubPhone SubPhone { get; set; }
public object Data { get; set; }
public DataBagTypeEnum DataBagType_Enum { get; set; }
}
あなたからのご連絡をお待ちしております、ありがとう
1月