Quando serializziamo o deserializziamo un oggetto con la classe JsonSerializer di System.Text.Json, tra i vari parametri che possiamo passare ci sono le opzioni di serializzazione espresse tramite un'istanza della classe JsonSerializerOptions. Quando dobbiamo usare la classe JsonSerializer passando sempre le stesse opzioni, possiamo ottenere un grosso miglioramento di performance e utilizzo della memoria mettendo in cache l'istanza della classe JsonSerializerOptions. Internamente, la libreria System.Text.Json associa all'istanza delle opzioni anche i metadati della classe da serializzare o deserializzare. Questo significa che quando usiamo una nuova istanza delle opzioni, i metadati vengono calcolati e quindi a ogni nuova istanza corrisponde un nuovo ricalcolo sempre degli stessi dati.
Per ottimizzare il processo di serializzazione/deserializzazione basta utilizzare una variabile statica con le opzioni.
public class CustomerService { readonly IHttpClientFactory _httpFactory; public static JsonSerializerOptions JsonOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web); static CustomerService() { JsonOptions.Converters.Add(new DateOnlyJsonConverter()); } public CustomerService(IHttpClientFactory httpFactory) { _httpFactory = httpFactory; } public Task<CustomerRead> GetByIdAsync(string id) { return _httpFactory.CreateClient("api").GetFromJsonAsync<CustomerRead>($"Customers/{id}", JsonOptions)!; } }
In questo esempio, la classe CustomerService ha una variabile statica che rappresenta le opzioni e che viene utilizzata ogni volta che andiamo a deserializzare il risultato della chiamata all'API nel metodo GetByIdAsync.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire script pre e post esecuzione di un workflow di GitHub
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Recuperare App Service cancellati su Azure
Creare una libreria CSS universale: i bottoni
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Change tracking e composition in Entity Framework
Montare Azure Blob Storage su Linux con BlobFuse2
Utilizzare Container Queries nominali
Fissare una versione dell'agent nelle pipeline di Azure DevOps
Fornire parametri ad un Web component HTML
Path addizionali per gli asset in ASP.NET Core MVC
Il nuovo controllo Range di Blazor 9
I più letti di oggi
- Analizzare il contenuto di una issue con GitHub Models e AI
- Integrare OpenAI tramite Aspire
- Visualizzare un template per browser mobile tramite un custom control ASP.NET
- Visualizzare l'errore esteso di ASP.NET in base all'indirizzo IP di connessione
- Interagire con Azure DevOps tramite MCP Server
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9
- Ottimizzare il codice #javascript con i Shorthand #patterns - terza parte https://aspit.co/ca7 di @morwalpiz
- Creare un agente A2Acon Azure Logic Apps
- Usare il RoleManager per gestire i ruoli con ASP.NET Identity