当对象从列表继承时序列化对象

时间:2016-05-03 15:53:05

标签: c# json inheritance serialization

[DataContract]
public class A : List<B>
{
    [DataMember]
    public double TestA { get; set; }
}

[DataContract]
public class B
{
    [DataMember]
    public double TestB { get; set; }
}

使用上面的模型,我尝试序列化以下对象:

List<A> list = new List<A>()
{
    new A() { TestA = 1 },
    new A() { TestA = 3 }
};

json = JsonConvert.SerializeObject(list);
//json: [[],[]]

TestA中我的两个值在哪里? 它可能与this thread(XML)重复,但我想知道是否没有选项通过设置一些JSON序列化选项来包含这些值?

注意:在类List<B>中创建属性A而不是继承是我的选择。

1 个答案:

答案 0 :(得分:1)

根据上述评论(谢谢!),有两种方法可以获得正确的结果:

  • 实施自定义JsonConvertersee here
  • Workarround:在类中创建一个返回项目(see here
  • 的属性

无论如何,从List<T>继承很少是一个很好的解决方案(see here

我已经尝试过使用workarround:

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class A : List<B>
{
    [JsonProperty]
    public double TestA { get; set; }

    [JsonProperty]
    public B[] Items
    {
        get
        {
            return this.ToArray();
        }
        set
        {
            if (value != null)
                this.AddRange(value);
        }
    }
}

public class B
{
    public double TestB { get; set; }
}

这适用于序列化和反序列化。重要提示:Items必须是Array B而不是List<B>。否则反序列化不适用于Items