Nello script #563 abbiamo visto come gestire la serializzazione di un oggetto che fa parte di una catena di ereditarietà. In quello script, l'oggetto serializzato aveva proprietà semplici, ma il discorso cambia quando aggiungiamo una proprietà il cui tipo può essere derivato. Riprendiamo ed espandiamo l'esempio dello script menzionato.
abstract class Vehicle { public string Fuel { get; set; } } class Car : Vehicle { public int Doors { get; set; } public Owner Owner { get; set; } } class Train : Vehicle { public int Coaches { get; set; } public Company Owner { get; set; } } class Owner { public string Name { get; set; } } class Person : Owner { public string Code { get; set; } } class Company : Owner { public string VatNumber { get; set; } }
Quando serializziamo un oggetto di tipo Train non abbiamo nessun problema in quanto il tipo specificato è quello finale quindi tutte le proprietà verranno serializzate. Quando ivece serializziamo un oggetto di tipo Car, solo la proprietà Name di Owner verrà serializzata. Se vogliamo serializzare correttamente tutto il grafo di oggetti, dobbiamo impostare la proprietà Owner di Car a object. Ovviamente questo meccanismo non è ideale perchè perdiamo completamente la tipizzazione del nostro modello a oggetti. In questi casi si può utilizzare un record da usare solamente per la serializzazione.
record CarRecord(string Fuel, int Doors, object Owner); var v = GetVehicle(); if (v is Car c) JsonSerializer.Serialize(new CarRecord(c.Fuel, c.Doors, c.Owner)); else { JsonSerializer.Serialize<object>(v); }
Questo codice è tutt'altro che ottimale, ma al momento il supporto di STJ per il polimorfismo è fortemente limitato. Nei progetti in cui si sfrutta molto l'ereditarietà, è consigliabile l'utilizzo di JSON.Net almeno finché STJ non introdurrà un miglior supporto a questa funzionalità.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Creare una libreria CSS universale: Clip-path
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Utilizzare una qualunque lista per i parametri di tipo params in C#
Introduzione ai web component HTML
Utilizzare DeepSeek R1 con Azure AI
Eliminare una project wiki di Azure DevOps
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Testare l'invio dei messaggi con Event Hubs Data Explorer
Migliorare la sicurezza dei prompt con Azure AI Studio
Utilizzare Hybrid Cache in .NET 9
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
I più letti di oggi
- a #RealCodeConf4 il 25 maggio a Firenze parleremo di #silverlight4. iscrizioni gratis su http://u.aspitalia.com/g9
- Parallelizzare le chiamate HTTP con async/await e le Promise in JavaScript
- Rendere sicuro l'endpoint di HealthCheck in ASP.NET Core
- #HTML5 schema per avere l'intellisense su #VS2008 (anche express) http://u.aspitalia.com/ed
- Eseguire una chiamata AJAX per inviare dati al server in Angular 2