Стратегии миграции сериализованного документа Json.NET между версиями / форматами
Я использую Json.Net для сериализации некоторых данных приложения. Конечно, спецификации приложения немного изменились, и нам необходимо провести рефакторинг некоторых данных бизнес-объектов. Каковы некоторые жизнеспособные стратегии для миграции ранее сериализованных данных в наш новый формат данных?
Например, скажем, у нас изначально был такой бизнес-объект, как:
public class Owner
{
public string Name {get;set;}
}
public class LeaseInstrument
{
public ObservableCollection<Owner> OriginalLessees {get;set;}
}
Мы сериализуем экземпляр LeaseInstrument в файл с Json.Net. Теперь мы изменим наши бизнес-объекты так, чтобы они выглядели так:
public class Owner
{
public string Name {get;set;}
}
public class LeaseOwner
{
public Owner Owner { get;set;}
public string DocumentName {get;set;}
}
public class LeaseInstrument
{
public ObservableCollection<LeaseOwner> OriginalLessees {get;set;}
}
Я рассмотрел написание пользовательского JsonConverter для LeaseInstrument, но метод ReadJson никогда не срабатывает ... вместо этого выдается исключение, прежде чем десериализатор достигнет этой точки:
Additional information: Type specified in JSON
'System.Collections.ObjectModel.ObservableCollection`1[[BreakoutLib.BO.Owner,
BreakoutLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]],
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
is not compatible with 'System.Collections.ObjectModel.ObservableCollection`1[[BreakoutLib.BO.LeaseOwner, BreakoutLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. Path 'Is.$values[8].OriginalLessors.$type', line 3142, position 120.
Я имею в виду, без шуток, Json.Net, поэтому я пытаюсь запустить JsonConverter при десериализации этих объектов, поэтому я могу вручную обработать тот факт, что сериализованный тип не соответствует скомпилированному типу !!
Для чего это стоит, вот JsonSerializerSettings, которые мы используем:
var settings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ContractResolver = new WritablePropertiesOnlyResolver(),
TypeNameHandling = TypeNameHandling.All,
ObjectCreationHandling = ObjectCreationHandling.Reuse
};