Сериализация и обратная совместимость (DataContractJsonSerializer) - PullRequest
0 голосов
/ 19 февраля 2020

Я использую 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'."}"

Есть ли способ решить эту проблему? Могу ли я указать сериализатору, какой тип по умолчанию создавать для интерфейса?

Спасибо!

...