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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi