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
Utilizzare Tailwind CSS all'interno di React: installazione
Usare un KeyedService di default in ASP.NET Core 8
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Usare lo spread operator con i collection initializer in C#
Reactive form tipizzati con modellazione del FormBuilder in Angular
Gestire i null nelle reactive form tipizzate di Angular
Configurare policy CORS in Azure Container Apps
Evitare la command injection in un workflow di GitHub
Routing statico e PreRendering in una Blazor Web App
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Usare una container image come runner di GitHub Actions
Effettuare il pull di git LFS in un workflow di GitHub