#c_sharp #сериализация #jsonnet
Имеется базовый класс AudioObject, от которого наследуются два класса: Audio и AudioUser.
Также имеем класс AudioList, в котором есть поле List. В этом поле может
храниться список объектов смешанных типов: Audio и AudioUser.
public class AudioObject
{
}
public class Audio : AudioObject
{
public uint id { get; set; }
public string title { get; set; }
}
public class AudioUser : AudioObject
{
public string id { get; set; }
public string name { get; set; }
}
public class AudioList
{
public int count { get; set; }
public List list { get; set; }
}
Попытаемся сериализовать и десириализовать объкт AudioList:
AudioList list = new AudioList();
list.count = 1;
list.list = new List { new Audio { id = 1, title = "Test"} };
string serialized = JsonConvert.SerializeObject(list);
AudioList newList = JsonConvert.DeserializeObject(serialized);
Audio audio = newList.list[0] as Audio;
Сериализация происходит успешно, но вот десериализация возвращает нулевые объекты
из списка List.
В чем моя ошибка?
Ответы
Ответ 1
You are getting null for audio because items in deserialized list are instances of base AudioObject class - according to List<> declaration. Add type information to [de]serialization: AudioList list = new AudioList(); list.count = 1; list.list = new List{ new Audio { id = 1, title = "Test"} }; JsonSerializerSettings settings = new JsonSerializerSettings() { TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All }; string serialized = JsonConvert.SerializeObject(list, settings); AudioList newList = JsonConvert.DeserializeObject (serialized, settings); Audio audio = newList.list[0] as Audio; Ответ 2
Используйте настройку TypeNameHandling, чтобы информация о типах сохранялась в JSON: JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto // или All для того, чтобы десериализовать не только объекты дочерних типов, // но и коллекции разных типов (IList/IEnumerable) }; string serialized = JsonConvert.SerializeObject(list, settings); AudioList newList = JsonConvert.DeserializeObject(serialized, settings); Audio audio = newList.list[0] as Audio; // != null
Комментариев нет:
Отправить комментарий