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
Leggere il contenuto di un file zip tramite le classi del namespace System.IO.Compression
Referenziare un package NuGet in una file based app .NET
Utilizzo delle Feature flag in ASP.NET Core
Operazioni tra insiemi di array in Javascript
Abilitare .NET 10 su Azure App Service e Azure Functions
Testare le API di Azure Resource Manager con API Playground
Leggere i parametri da riga di comando in una file based app .NET
Utilizzare le librerie native di .NET per comprimere uno o più file in formato ZIP
Stop Building Chatbots. Build a team
Monitorare le tabelle di Azure SQL Database con Change Event Streaming
Usare il metodo nameof con un tipo generico in C# 14
Eseguire i pre-commit hook di git con dependabot


