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