我在这里阅读了几篇类似的帖子,但他们中的大多数都试图做一些比我想要完成的更难的事情。其余的帖子似乎对我没用。
我有2个班级:
public class Zone
{
public Zone() { Areas = new List<IZoneArea>(); }
public string Name { get; set; }
public List<IZoneArea> Areas { get; set; }
}
public class ZoneArea
{
public string Name { get; set; }
}
我想要做的就是选择一个人口密集的区域,例如:列出区域,并成功序列化它们并使用JsonConvert和Serialize / Deserialize Object方法对它们进行DeSerialize。我似乎无法让它发挥作用。
这是我到目前为止所尝试的内容:
1.在区域类中的区域属性上方添加了一个属性,如跟随[JsonConverter(typeof(ZoneAreaConverter))]
然后编写并尝试了几个不同的ZoneArea转换器,如下所示:
// This method is the same in all the variations
public override bool CanConvert(Type objectType)
{
return objectType == typeof(IZoneArea);
}
// The following is only one of the variations of the ReadJson method I tried
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var data = JObject.Load(reader);
var area = new ZoneArea();
serializer.Populate(data.CreateReader(), area);
return area;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
经过几次变化之后,我从SO处采取了不同的推荐方法,并从Zone类中删除了该属性,而是创建了一个CustomCreationConverter,如下所示:
public class ZoneAreaConverter : CustomCreationConverter<IZoneArea>
{
public override IZoneArea Create(Type objectType)
{
return new ZoneArea();
}
}
并尝试反序列化:
var zones = JsonConvert.DeserializeObject<List<Zone>>(cache.Cache.ToString(), new ZoneAreaConverter());
我一直觉得自己非常接近但却错过了什么。