#123 - Intercettare gli eventi del serializzatore WCF

Windows Communication Foundation è un framework per lo sviluppo di servizi che sfrutta la classe DataContractSerializer per serializzare e deserializzare i messaggi che questi si scambiano. Indipendentemente dal formato XML, binario o MTOM, sono disponibili attributi per indicare quali membri serializzare e quali no. E' possibile inoltre monitorare e intercettare gli eventi di serializzazione che coinvolgono una classe attraverso gli attributi OnSerializingAttribute, OnSerializedAttribute, OnDeserializingAttribute e OnDeserializedAttribute del namespace System.Runtime.Serialization.

L'uso è piuttosto semplice: basta definire un metodo che accetti uno StreamingContext e marcarlo con l'attributo dell'evento desiderato.

L'esempio seguente intercetta la serializzazione per non restituire il valore di una proprietà. Questa tecnica è sfruttata dalle entità di WCF per poter essere serializzate.

public class Product 
{ 
 
  public int ID { get; set; } 
  public string Description { get; set; } 
 
  private bool serializing; 
 
  public IEnumerable<Order> Orders 
  { 
    get 
    { 
      // Se sta serializzando non restituisco niente 
      if (serializing) 
        return null; 
      return GetOrders(); 
    } 
  } 
 
  [OnSerializing] 
  private void OnSerializing(StreamingContext context) 
  { 
    serializing = true; 
  } 
 
  [OnSerialized] 
  private void OnSerialized(StreamingContext context) 
  { 
    serializing = false; 
  } 
 
} 

Il test può essere fatto serializzando una semplice classe:

Product p = new Product 
{ 
  ID = 1, 
  Description = "Test", 
}; 
 
DataContractSerializer serializer = new DataContractSerializer(p.GetType()); 
using (XmlWriter writer = XmlDictionaryWriter.Create(Console.Out)) 
{ 
  serializer.WriteObject(writer, p); 
}

IL CONTENUTO
SCRIPT VIA E-MAIL

Iscriviti alle nostre newsletter unoscript@lgiorno e Xcript per ricevere gli script via e-mail.

MEDIA
IN EVIDENZA
MISC