序列化使用Json.Net声明为new的继承属性不起作用

时间:2012-05-09 11:31:48

标签: c# serialization json.net

Json.Net序列化子类中的重写属性没有问题。

public override ICollection<Person> Persons { get; set; }

但是如果我尝试在属性上使用new,则序列化失败。没有例外; Persons永远不会被序列化。

public new ICollection<Person> Persons { get; set; }

这是为什么?

(这个例子没有多大意义,我知道。这只是一个例子。后来的目标是能够改变属性public new ICollection<PersonDto> Persons { get; set; }的数据类型)

2 个答案:

答案 0 :(得分:2)

我发现了一种更简单的解决方法,无需创建自定义JsonConverter

如果将属性JsonProperty放在属性上,它就可以工作。

[JsonProperty]
public new ICollection<PersonDto> Persons { get; set; }

我不知道为什么Json.Net需要这个属性。通常它会将未使用JsonIgnore修饰的所有内容序列化。如果有人知道,欢迎您发表评论。

答案 1 :(得分:1)

如果你想这样做是因为你想指定Person序列化到JSON的确切程度,我认为更好的解决方案是使用自定义JsonConverter。转换器看起来像这样:

class PersonConverter : JsonConverter
{
    public override void WriteJson(
        JsonWriter writer, object value, JsonSerializer serializer)
    {
        var person = (Person)value;
        serializer.Serialize(
            writer,
            new
            {
                Name = person.LastName,
                Age = (int)(DateTime.Now - person.BirthDate).TotalDays / 365
            });
    }

    public override object ReadJson(
        JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Person);
    }
}

然后您可以像这样使用它:

JsonConvert.SerializeObject(yourObject, new PersonConverter())