Nello script #89 si è visto una tipica problematica che si affronta quando si usa WCF o in generale il DataContractSerializer. Il motore infatti necessita di conoscere quali sono i tipi serializzabili e quali può trovarsi di fronte nel caso in cui il tipo da serializzare sia astratto o ereditato da altri tipi.
Mediante l'attributo KnowType si risolve il problema e si istruisce il motore dei tipi conosciuti. Non sempre però questo è possibile, soprattutto in situazioni di modularità dove i tipi vengono risolti a runtime o sono pluggabili, perciò non conosciuti in partenza.
Per risolvere questo problema, il medesimo attributo permette di indicare il nome del metodo statico, definito sulla classe stessa, che permette di risolvere a runtime i tipi conosciuti. Questo metodo deve obbligatoriamente restituire un array di Type, ma la sua implementazione dipende dalle logiche dell'applicazione.
Nell'esempio seguente si caricano i tipi dell'assembly che li contiene.
[KnownType("GetKnownType")] public abstract class PostBase { private static Type[] GetKnownType() { if (knownTypes == null) knownTypes = typeof(PostBase).Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(PostBase))).ToArray(); return knownTypes; }
E' opportuno, poiché chiamato numerose volte, effettuare cache della lista così da velocizzare il processo di serializzazione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Integrare SQL Server in un progetto .NET Aspire
Ordine e importanza per @layer in CSS
Centralizzare gli endpoint AI Foundry con Azure API Management
Eseguire script pre e post esecuzione di un workflow di GitHub
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
La gestione della riconnessione al server di Blazor in .NET 9
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Ridurre il reflow ottimizzando il CSS
Gestione CSS in Blazor con .NET 9
Gestione ciclo di vita in .NET Aspire
Rendere le variabili read-only in una pipeline di Azure DevOps