Хорошо, мы используем продукт JSON.NET от Newtonsoft, который мне очень нравится. Тем не менее, у меня есть простая структура классов для иерархических расположений, которые выглядят примерно так ...
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<Location>
, а был бы просто обычным объектом, который вместо этого имел свойство Items
типа List<Location>
.
{
"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