如何使用Json.NET重建我的类层次结构?

时间:2010-08-18 14:47:02

标签: c# json serialization

我有一个简单的类层次结构。 Foo是基类。 Bar和Baz继承自Foo。这些类的实例存储在List中。我必须将列表序列化为JSON。它工作得很好。但问题是将其反序列化为List<>。

我把Foos,Bars和Bazs放在列表中,序列化它,当我反序列化它时我只得到了Foos :)我想要我的Bars和Bazs。这可能与Json.NET有关吗?

using System;
using System.Collections.Generic;

using Newtonsoft.Json;

namespace JsonTest
{
  class Foo
  {
    int number;

    public Foo(int number)
    {
      this.number = number;
    }

    public int Number
    {
      get { return number; }
      set { number = value; }
    }
  }

  class Bar : Foo
  {
    string name;

    public Bar(int number, string name)
      : base(number)
    {
      this.name = name;
    }

    public string Name
    {
      get { return name; }
      set { name = value; }
    }
  }

  class Baz : Foo
  {
    float time;

    public Baz(int number, float time)
      : base(number)
    {
      this.time = time;
    }

    public float Time
    {
      get { return time; }
      set { time = value; }
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      List<Foo> fooList = new List<Foo>();
      fooList.Add(new Foo(123));
      fooList.Add(new Bar(123, "Hello, world"));
      fooList.Add(new Baz(123, 0.123f));

      string json = JsonConvert.SerializeObject(fooList, Formatting.Indented);
      List<Foo> fooList2 = JsonConvert.DeserializeObject<List<Foo>>(json);
      // Now I have only Foos in the List
    }
  }
}

1 个答案:

答案 0 :(得分:0)

您正在序列化Foos列表,而不是Baz和Bars列表 我认为保持逻辑的最简单的解决方案是序列化Baz和Bars列表并将列表连接起来(这只有在你可以使用不同的顺序时才有效)。
通常,使用此设计看起来并不自然。最好让一个类具有不同的构造函数,并在该字段不适用时使用null。