Windows Communication Foundation è un motore per realizzare servizi che è possibile personalizzare in tutti gli aspetti: contratti, binding, operazioni, comportamenti. Normalmente, il serializzatore usato per convertire il grafo degli oggetti in XML infoset è il DataContractSerializer che, in un unione ai writer, materializzano la struttura in XML testuale, MTOM o binario.

E' possibile però cambiare questo comportamento cambiando il motore della serializzazione. E' disponibile ad esempio un progetto open source di nome protobuf-net che sfrutta la stessa tecnica di serializzazione usata da Google per le comunicazioni. Essa si basa su una serializzazione binaria che non utilizza nomi e namespace, snellendo molto la dimensione dei messaggi. Oltre a questo il motore si dimostra decisamente performante, anche due o tre volte superiore a quello predefinito di WCF.

Per utilizzarlo occorre scaricare la libreria dal sito http://code.google.com/p/protobuf-net/ e referenziarla. Per cambiare il serializzatore ci sono molte tecniche, ma la più semplice è agire sul behavior del client e del servizio. Si modifica quindi nell'app.config la sezione system.serviceModel come nel codice seguente:

<system.serviceModel>
  <extensions>
    <behaviorExtensions>
      <add name="ProtoBufSerialization" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=1.0.0.282, Culture=neutral, PublicKeyToken=257b51d87d2e4d67"/>
    </behaviorExtensions>
  </extensions>
<system.serviceModel>

La dichiarazione dell'estensione permette di utilizzarla poi nel behavior generico o specifico di un servizio:

<behaviors>
  <endpointBehaviors>
    <behavior>
      <ProtoBufSerialization/>
    </behavior>
  </endpointBehaviors>
</behaviors>

Infine, per rendere funzionante protobuf, è necessario marcare le classi con gli attributi ProtoContract e ProtoMember che, in modo del tutto simile al DataContractSerializer, indicano quali membri serializzare.

[DataContract]
[ProtoContract]
public class Result
{
  [ProtoMember(1)]
  [DataMember]
  public string Name { get; set; }

  [ProtoMember(2)]
  [DataMember]
  public int Quantity { get; set; }
}

Per maggiori informazioni si rimanda alla documentazione
http://code.google.com/p/protobuf-net/w/list

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