Strategien für die Migration von serialisierten Json.NET-Dokumenten zwischen Versionen / Formaten

Ich verwende Json.Net, um einige Anwendungsdaten zu serialisieren. Natürlich haben sich die Anwendungsspezifikationen geringfügig geändert, und wir müssen einige der Geschäftsobjektdaten überarbeiten. Welche Strategien sind sinnvoll, um zuvor serialisierte Daten in unser neues Datenformat zu migrieren?

Angenommen, wir hatten ursprünglich ein Geschäftsobjekt wie:

public class Owner
{
    public string Name {get;set;} 
}
public class LeaseInstrument
{
    public ObservableCollection<Owner> OriginalLessees {get;set;}
}

Wir serialisieren eine Instanz eines LeaseInstrument in eine Datei mit Json.Net. Jetzt ändern wir unsere Geschäftsobjekte so, dass sie wie folgt aussehen:

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;}
}

Ich habe versucht, einen benutzerdefinierten JsonConverter für LeaseInstrument zu schreiben, aber die ReadJson-Methode wird nie getroffen ... stattdessen wird eine Ausnahme ausgelöst, bevor der Deserializer diesen Punkt erreicht:

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.

Ich meine, kein Scherz, Json.Net, deshalb versuche ich, einen JsonConverter auszuführen, wenn ich diese Objekte deserialisiere, damit ich die Tatsache manuell handhaben kann, dass der serialisierte Typ nicht mit dem kompilierten Typ übereinstimmt !!

Für das, was es wert ist, sind hier die JsonSerializerSettings, die wir verwenden:

var settings = new JsonSerializerSettings
    {
      PreserveReferencesHandling = PreserveReferencesHandling.Objects,
      ContractResolver = new WritablePropertiesOnlyResolver(),
      TypeNameHandling = TypeNameHandling.All,
      ObjectCreationHandling = ObjectCreationHandling.Reuse
    };

Antworten auf die Frage(4)

Ihre Antwort auf die Frage