Есть ли способ сериализации JSON.NET подкласса List , который также имеет дополнительные свойства?

Хорошо, мы используем продукт Newtonsoft JSON.NET, который мне очень нравится. Однако у меня есть простая структура классов для иерархических расположений, которые выглядят примерно так ...

public class Location
{
    public string Name{ get; set; }
    public LocationList Locations{ get; set; }
}

// Note: LocationList is simply a subclass of a List<T>
// which then adds an IsExpanded property for use by the UI.
public class LocationList : List<Location>
{
    public bool IsExpanded{ get; set; }
}

public class RootViewModel
{
    public LocationList RootLocations{ get; set; }
}

... и когда я их сериализую в JSON, все работает отлично, за исключением исключения свойства IsExpanded в классе LocationList. Сериализуется только содержимое списка.

Вот то, что я предполагаю, было бы хорошим форматом. По сути, это то же самое, как если бы LocationList не был подклассом List , а был просто обычным объектом со свойством под названием Items of вместо этого введите List .

{
  "Locations":
  {
    "IsExpanded": true,
    "Items": [
      {
        "Name": "Main Residence",
        "Locations":
        {
          "IsExpanded": true,
          "Items": [
            {
              "Name": "First Floor",
              "Locations":
              {
                "IsExpanded": false,
                "Items": [
                  {
                    "Name": "Livingroom"
                  },
                  {
                    "Name": "Dining Room"
                  },
                  {
                    "Name": "Kitchen"
                  }
                ]
            },
            {
              "Name": "Second Floor",
              "Locations":
              {
                "IsExpanded": false,
                "Items": [
                  {
                    "Name": "Master Bedroom"
                  },
                  {
                    "Name": "Guest Bedroom"
                  }
                ]
            },
            {
              "Name": "Basement"
            }
          ]
        }
      }
    ]
  }
}

Теперь я также понимаю, что Newtonsoft ' Продукт является расширяемым, потому что в них конкретно говорится о том, как вы можете написать свой собственный сериализатор для определенных типов данных, что было бы именно тем, что я хотел бы здесь. Однако у них нет хороших примеров кода, как это сделать.

Если мы (сообщество SO) сможем это выяснить, технически с помощью вышеуказанного формата мы сможем сериализовать ЛЮБОЙ подкласс List (или его производные / аналогичные объекты) при условии, что у них еще нет свойства с именем Items (который, ИМХО, был бы плохим дизайном в первую очередь, так как это сбивало бы с толку, как дерьмо!) Возможно, мы даже сможем заставить Newtonsoft встроить такую ​​вещь в свой сериализатор изначально!

Итак, это сказано. .. кто-нибудь знает, как настроить сериализатор / десериализатор для обработки этого объекта по-другому?

M

11
задан MarqueIV 26 January 2013 в 04:43
поделиться