Есть базовый класс и несколько его потомков:
class Base {...}
class A : Base {...}
class B : Base {...}
И коллекция этих объектов:
ObservableCollection<Base> Actions {get;set;}
В интерфейсной части для каждого типа объектов определен свой DataTemplate, но после выполнения десериализация все объекты коллекции апкастятся до Base и не отображают заданный шаблон.
Сериализация производится в Json с помощью библиотеки от Newtonsoft:
public static void Serialize(string path, object savedObject)
{
var json = JsonConvert.SerializeObject(savedObject);
using (var fs = new FileStream(path, FileMode.Create))
{
byte[] array = System.Text.Encoding.UTF8.GetBytes(json);
fs.Write(array, 0, array.Length);
}
}
public static object Deserialize(string path, Type type)
{
string json = File.ReadAllText(path);
return JsonConvert.DeserializeObject(json, type);
}
Как исправить это?
class Base {...}
class A : Base {...}
class B : Base {...}
var list = new List<Base>()
{
new A(),
new B()
}
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
};
var json = JsonConvert.SerializeObject(list, settings);
var obj = JsonConvert.DeserializeObject<List<Base>>(json, settings);
Помог ответ с английского SO:
Нужно включить типы в сериализацию с помощью TypeNameHandling. В итоге методы преобразовались следующим образом:
public static void JsonSerialize(string path, object savedObject)
{
JsonSerializerSettings settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
};
var json = JsonConvert.SerializeObject(savedObject, settings);
using (var fs = new FileStream(path, FileMode.Create))
{
byte[] array = System.Text.Encoding.UTF8.GetBytes(json);
fs.Write(array, 0, array.Length);
}
}
public static object JsonDeserialize(string path, Type type)
{
JsonSerializerSettings settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
};
string json = File.ReadAllText(path);
return JsonConvert.DeserializeObject(json, type, settings);
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости