Десериализация абстрактного класса в 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.


Ответы (0 шт):