Я использую DataContractJsonSerializer.
В настоящее время мой сериализованный объект содержал член класса "Настройки"
Теперь я хотел бы расширить свою поддержку и сериализовать любой класс, реализующий интерфейс ISettings. .
[DataContract(Namespace = "")]
[KnownType(typeof(SystemSettings))]
[KnownType(typeof(PrivateSettings))]
public class Data
{
[DataMember]
public ISettings settings { get; set; }
}
public interface ISettings
{
}
[DataContract(Namespace = "")]
public class SystemSettings : ISettings
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string SysName { get; set; }
}
[DataContract(Namespace = "")]
public class PrivateSettings : ISettings
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string PrivateName { get; set; }
}
Это прекрасно работает, так как сериализованные данные содержат тип объекта
<?xml version="1.0" encoding="utf-8"?>
<root type="object">
<settings __type="SystemSettings" type="object">
<Name>System Settings</Name>
<SysName>New System</SysName>
</settings>
</root>
Моя проблема связана с обратной совместимостью . Существующие сериализованные файлы не содержат тип объекта (__type = "SystemSettings"). При десериализации старых данных в моем классе я получаю
"{"Unable to cast object of type 'System.Object' to type 'JsonSerializer.ISettings'."}"
Есть ли способ решить эту проблему? Могу ли я указать сериализатору, какой тип по умолчанию создавать для интерфейса?
Спасибо!