Proprietà override di deserializzazione Json

0

Richiamare la tecnologia: C# , Newtonsoft.Json .

Abbiamo una classe che contiene una proprietà denominata SchemaVersion che usiamo per informare della versione del documento Json una volta che l'oggetto è in definitiva serializzato nel nostro CosmosDb.

Attualmente questa proprietà è impostata nel costruttore della classe dell'oggetto, e per semplicità supponiamo che sia "1.0"

Finora abbiamo aggiunto solo alla nostra classe & incrementato "1.0" in "2.0" , quindi quando deserializziamo il documento non dell'ultima SchemaVersion vogliamo sempre "aggiornarlo" e questo viene fatto semplicemente controllando il valore di quella proprietà ..

private string _schemaVersion;
public string SchemaVersion
{
    get => _schemaVersion != "2.0" ? "2.0" : _schemaVersion;
    set => _schemaVersion = value;
}

I nuovi oggetti hanno ancora il loro SchemaVersion impostato con il costruttore di oggetti. Questo mi sembra un po 'goffo .. ma fa il lavoro.

Tuttavia, so che arriverà un punto in cui dobbiamo rifattorizzare la classe per qualche motivo ancora sconosciuto. Cercheremo di evitarlo il più possibile .. ma posso vederlo accadere.

La sfida diventa allora come manteniamo le conversioni tra

  • "1.0" - > %codice%
  • "x.0" - > %codice%
  • "2.0" - > %codice%
  • "x.0" - > %codice%

Esistono modi consigliati in cui è meglio gestirlo? L'idea migliore che ho adesso è un JsonConverter personalizzato, che ho scritto prima per deserializzare documenti Json sconosciuti su un oggetto specifico basato su una proprietà all'interno di quel documento ... ma mi chiedo se sia troppo complicato come faremo < em> sempre fai la deserializzazione in una forma più recente ...

Temo che questo potrebbe diventare complesso rapidamente se ci ritroviamo con molte versioni e tutte le conversioni alla versione più recente devono essere mantenute separatamente ..

    
posta m1nkeh 14.10.2018 - 12:57
fonte

1 risposta

0

Data la complessità e il tempo sufficienti sarà necessario implementare classi di convertitori che convertano le vecchie versioni dell'oggetto in nuove versioni.

Questi convertitori avranno più logica che puoi spremere sensibilmente in classi di derserialiation, quindi eviterei che la tua classe sia più di una singola versione.

es. la versione dello schema, o semplicemente la versione, dovrebbe essere una costante. Probabilmente userò la versione assembly della dll contenente il modello.

Quando carichi vecchie versioni dell'oggetto serializzato, controlla la versione prima della deserializzazione e carica il convertitore appropraite per quella versione.

Per semplici rilasci di punti senza modifiche di rottura, la classe del convertitore potrebbe essere un semplice deserializzatore predefinito per la versione corrente della classe.

Ma quando ottieni una modifica di rottura puoi aggiungere la logica personalizzata per passare alla logica di conversione per la versione specifica che stai tentando di caricare (o lanciare un'eccezione per una versione sconosciuta)

    
risposta data 14.10.2018 - 13:35
fonte

Leggi altre domande sui tag