Quando serializziamo o deserializziamo un oggetto in JSON usando la libreria System.Text.Json, la prima volta l'oggetto viene analizzato usando la reflection per recuperare informazioni sulle proprietà. Le informazioni recuperate via reflection vengono poi usate per velocizzare le successive operazioni di serializzazione e deserializzazione.
Questo significa che la prima operazione è estremamente più lenta rispetto alle altre. Per ovviare a questo problema, .NET 6 introduce la possibilità di usare i source generators per generare le informazioni sui tipi da serializzare/deserializzare già in fase di compilazione. In questo modo queste informazioni saranno disponibili da subito ottimizzando sensibilmente non solo le performance del primo accesso, ma anche l'utilizzo della memoria in quanto le operazioni di reflection sono pesanti.
Per sfruttare questa caratteristica, dobbiamo creare una classe che eredita da JsonSerializationContext e marcarla con l'attributo JsonSerializable al quale passiamo in input il tipo da serializzare.
public class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } [JsonSerializable(typeof(Person))] partial class GeneratedJsonContext : JsonSerializerContext { }
Se dobbiamo serializzare/deserializzare più classi, ci basta aggiungere un attributo JsonSerializable per ogni classe. Una volta specificati tutti i tipi, i loro metadati sono esposti tramite la proprietà Default di GeneratedJsonContext la quale contiene una proprietà per ogni tipo. Questi metadati li possiamo passare in input ai metodi di serializzazione e deserializzazione così da renderli disponibili al processo.
var2 person = new() { FirstName = "Stefano", LastName = "Mostarda" }; var json = JsonSerializer.Serialize(person, MyJsonContext.Default.Person); person = JsonSerializer.Deserialize(json, MyJsonContext.Default.Person);
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Autenticazione con Minimal API di ASP.NET Core 6
Gestire le chiamate a servizi esterni in ASP.NET Core e Blazor tramite Polly
Velocizzare l'installazione delle dipendenze in un workflow di GitHub
Eseguire uno scroll all'interno di una pagina Blazor
Utilizzare il Service Bus Explorer integrato del portale Azure
Gestire dati sensibili nella configurazione in ASP.NET Core
Utilizzare la visualizzazione flex per spostare una sidebar in base alle dimensioni dello schermo
Le novità di Entity Framework Core 6
Scoprire le ottimizzazioni di Entity Framework Core in fase di scrittura di un solo record
Definire una tabella come memory optimized su Sql Server tramite EF Core
Utilizzare WordPress con Azure App Service
Utilizzare l'API del browser fetch
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Gestire il breaking change di Entity Framework Core 7 con tabelle che usano identity e trigger
- Raggruppare i parametri di una minimal API in un singolo oggetto in ASP.NET Core
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Speciale Visual Studio 2013 e .NET Framework 4.5.1: One ASP.NET, Windows 8.1, Entity Framework 6