c# – Inheritance and serialization

Question:

There is a base class, AudioObject , from which two classes inherit: Audio and AudioUser . We also have an AudioList class that has a List<AudioObject> field. This field can store a list of objects of mixed types: Audio and 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<AudioObject> list { get; set; }
}

Let's try to serialize and deserialize the AudioList AudioList :

AudioList list = new AudioList();
list.count = 1;
list.list = new List<AudioObject> { new Audio { id = 1, title = "Test"} };

string serialized = JsonConvert.SerializeObject(list);

AudioList newList = JsonConvert.DeserializeObject<AudioList>(serialized);
Audio audio = newList.list[0] as Audio;

Serialization is successful, but deserialization returns null objects from the List<AudioObject> .

What's my mistake?

Answer:

Use the TypeNameHandling setting to TypeNameHandling the type information in JSON:

JsonSerializerSettings settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto
    // или All для того, чтобы десериализовать не только объекты дочерних типов,
    // но и коллекции разных типов (IList/IEnumerable)
};
string serialized = JsonConvert.SerializeObject(list, settings);

AudioList newList = JsonConvert.DeserializeObject<AudioList>(serialized, settings);
Audio audio = newList.list[0] as Audio; // != null
Scroll to Top