Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Наследование и сериализация

#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

Комментариев нет:

Отправить комментарий