WebService, Serializzazione, dati nullabili e interop 1.x e 2.0

[English version]

Finalmente con la versione 2.0 del Framework la serializzaione ci darà la possibilità di inserire nei nostri xml dati nulli secondo gli standard xml, xsi:nil.Tale possibilità ci viene offerta dai nullable types. L'xml è ad oggi considerato il re dei formati di interoperazione tra sistemi eterogenei per tecnologia. Un possibile scenario del prossimo futuro potrebbe essere quello di avere il sistema server che espone servizi web implementati con la 2.0 e client implementati con la 1.x.  Ovviamente la cosa è possibilissima. Ma cosa succede se il server espone un nullable type? Client-side interpreta il wsdl correttamente e genera quindi senza problemi la classe proxy.. ovviamente non disponendo di nullable types nativi i dati nullabili verranno sostituiti con tipi non nullabili (esempio bool invece di bool?). Anche a runtime tutto sembra andare bene ma quando ci troviamo davanti il primo dato nullo ecco che il serialializer della 1.x non riesce a interpretarlo generando errore.

So già che per questo molti scenderanno in piazza dicendo che l'xml generato dalla 2.0 non è compatibile con quello della 1.x... in realtà è solo che il Serializer della 1.x ha meno potenzialità di quello della 2.0 - mi sembra il minino - e per questo occorre avere qualche attenzione in più. 

Come risolvere? I NullableTypes di Luka sono un ottima soluzione alla cosa! I NullableTypes implementano IXmlSerializable, hanno quindi una serializazione Xml personalizzata che è conforme alla serializzazione dei nullable type nativi della 2.0! Fantastiko! :-D Dopo avere generato la classe proxy con VS2003 occorre personalizzarla e sostituire i value type nullabili con i tipi nullabili di Luka :-D

L'interoperabilità vale anche al contrario. Un server web che espone servizi implementati con la 1.x può usare i NullableTypes per esporre dati nullabili; una applicazione client 2.0 che vuole consumare tali servizi può con VS2005 interpretare senza problemi il wsdl per generare la classe proxy. I tipi nullabili  non vengono però convertiti correttamente ma vengono mappati come XmlElement. Sarà però possibile modificare tale classe sostituendo gli XmlElement con i Nullable<T> corrispondenti ai tipi che devono mappare e il gioco è fatto! :-D

Buona interop a tutti! :-D

«novembre»
domlunmarmergiovensab
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910