6

Oct

WCF DataContractSerializer vs NetDataContractSerializer

Ciao a tutti

non molti sanno che il serializzatore di default del WCF DataContractSerializer ha un suo clone chiamato NetDataContractSerializer.

La seconda versione appende degli attributi informativi extra nell'xml del messaggio per specificare l'assembly di riferimento dei tipi serializzati

Questo accade perchè è necessario per compatibilità con il TCP-Remoting del .NET 2.0 che usava un binding binario su TCP e che richiedeva la versione specifica dell'assembly da utilizzare.

In WCF questo comportamento sdoppiato a scelta del motore apre a 2 scenari: fortemente disaccoppiato (SharedContract) dove ogni servizio pubblica i tipi esposti sotto il proprio namespace univoco, eventualmente andando a duplicare i tipi riutilizzati da servizi in comune, o a basso accoppiamento (SharedType) dove appunto usando il serializzatore NetDataContractSerializer è in grado di specificare l'assembly di riferimento del relativo tipo esposto, andando eventualmente a cumulare i tipi comuni a più assembly.

Per influenzare la scelta del servizio si puo o andare a realizzare una extension a WCF che va a cambiare a mano il serializzatore, come mostrato qui (http://www.pluralsight-training.net/community/blogs/aaron/archive/2006/04/21/22284.aspx) o specificare all'atto della connessione (addServiceReference) se riutilizzare o no i tipi in comune.

Attenzione però che il serializzatore NetDataContractSerializer aggiunge un overhead del 20% in dimensione del messaggio e tempo di serializzazione

by Antonio Esposito on 10/6/2010