Десериализация абстрактного класса в JSON в C#
Имеется абстрактный класс Worker, который имеет 2 наследника Hourly и Fixed, в которых просто переопределяется абстрактный метод. Также имеется класс Organization, содержащий List<Worker>:
public class Organization
{
public List<Worker> Workers { get; set; } = new List<Worker>();
}
В классе Program создается объект: Organization company = new Organization();. В ходе работы программы company.Workers заполняется экземплярами классов Hourly и Fixed.
Нужно организовать сериализацию в workers.json и десериализацию из workers.json в тот же самый company.Workers. Я использую Newtonsoft.
Сериализация в следующем виде работает без проблем:
using (StreamWriter file = File.CreateText("workers.json"))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(file, company.Workers);
}
А вот при десериализации происходит следующая ошибка: Could not create an instance of type ConsoleApplication2.Worker. Type is an interface or abstract class and cannot be instantiated.. Я пробовал 2 разных способа:
using (StreamReader file = File.OpenText("workers.json"))
{
JsonSerializer serializer = new JsonSerializer();
company.Workers = (List<Worker>)serializer.Deserialize(file, typeof(List<Worker>));
}
и
using (FileStream fstream = File.OpenRead("workers.json"))
{
byte[] array = new byte[fstream.Length];
fstream.Read(array, 0, array.Length);
string file = System.Text.Encoding.Default.GetString(array);
company.Workers = JsonConvert.DeserializeObject<List<Worker>>(file);
}
В обоих случаях происходит указанная выше ошибка. Я пробовал искать решение на разных ресурсах, но не нашел ничего, что бы мне подошло.
upd
Проблема заключалась в том, что как при сериализации, таки и при десериализации нужно было создать var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, Formatting = Formatting.Indented };. При сериализации вместо JsonSerializer(); используем JsonSerializer.Create(settings);, а при десериализации передаем settings вторым параметром вместе с file.