Как восстановить мою иерархию классов с помощью Json.NET? - PullRequest
4 голосов
/ 18 августа 2010

У меня есть простая иерархия классов.Фу является базовым классом.Бар и Баз унаследованы от Фу.Экземпляры этих классов хранятся в списке.Я должен сериализовать список в JSON.Это работает довольно хорошо.Но проблема заключается в десериализации его обратно в список <>.

Я помещаю 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 голосов
/ 19 августа 2010

Вы сериализуете список Foos, а не список Baz и Bars.
Я думаю, что самым простым решением для сохранения вашей логики было бы сериализовать список Baz и Bars и объединить список (это будет работать толькоесли вы можете жить с другим порядком).
В целом, это не выглядит естественным для работы с этим дизайном.Было бы лучше иметь один класс с разными конструкторами и использовать ноль, когда поле не применимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...