Il .NET Remoting e ASP.NET Web Service mettono a disposizione funzionalità di serializzazione distinte e complementari. Confonderle è facile.
Ho imparato a distinguerle sbattendoci la testa e sbagliando. Per fare un pò d'ordine, questo è quello che ho scoperto.
L'infrastruttura del .NET Remoting abilita lo sviluppo di applicazioni distribuite permettendo di accedere in maniera trasparente ad oggetti dislocati remotamente.
Il .NET Remoting gestisce e preserva fedelmente i tipi definiti dal CLR (per la precisione dal CTS) e grazie a ciò gli oggetti serializzati dal .NET Remoting contengono tanto i membri pubblici quanto quelli privati inoltre i grafi di oggetti e gli oggetti contenitori (per es. le Collections) vengono serializzati correttamente.
Il .NET Remoting si basa sulle funzionalità fornite dal namespace System.Runtime.Serialization
ed in particolare fa uso dei due formattatori standard System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
e System.Runtime.Serialization.Formatters.Soap.SoapFormatter
.
Il .NET Remoting permette di realizzare anche dei Web Service tuttavia utilizza estensioni proprietarie specifiche di .NET e del CLR quindi questi Web Service corrono il rischio di essere fruibili solo da Client .NET. Inoltre il Remoting utilizza il formato SOAP detto RPC/encoded ma non supporta il formato SOAP detto Document/literal molto diffuso.
Questo spiega che nonostante un tipo sia serializzabile con il SoapFormatter ciò non è sufficiente a garantire che il tipo funzioni correttamente con gli ASP.NET Web Service. Da codice la serializzazione del .NET Remoting si controlla principalmente con l'attributo Serializable
, l'interfaccia ISerializable
ma anche con l'attributo NonSerialized
e l'interfaccia IDeserializationCallback
. Comunque il risultato è rilevante solo per la serializzazione del .NET Remoting e non per la serializzazione degli ASP.NET Web Service .
L'infrastruttura degli ASP.NET Web Service abilita l'esposizione di funzioni applicative in Internet tramite protocolli e formati standard aperti, rendendo interoperabili applicazioni sviluppate con tecnologie proprietarie differenti.
Gli ASP.NET Web Service gestiscono e preservano fedelmente i tipi definiti con gli XML Schema (XSD) quindi non gestiscono indexers, fields privati o read-only o grafi di oggetti mentre gestiscono solo parzialmente gli oggetti contenitori (per es. le Collections).
Gli ASP.NET Web Service si basano sulle funzionalità di System.Xml.Serialization.XmlSerializer
per serializzare i messaggi SOAP e gli oggetti coinvolti a run-time. Inoltre gli ASP.NET Web Service utilizza il formato SOAP Document/literal e supportano anche il formato SOAP RPC/encoded.
A questo punto è chiaro che un tipo per funzionare correttamente con gli ASP.NET Web Service deve essere serializzabile con lo XmlSerializer
.
La serializzazione con XmlSerializer
è controllabile mediante gli attributi XmlAnyAttribute
, XmlAnyElement
, XmlArray
, XmlArrayItem
, XmlAttribute
, XmlChoiceIdentifier
, XmlElement
, XmlEnum
, XmlIgnore
, XmlInclude
, XmlRoot
, XmlText
, XmlType
e mediante gli attributi SoapAttribute
, SoapElement
, SoapEnum
, SoapIgnore
, SoapInclude
, SoapType
. Infine per avere il controllo totale della serializzazione mediante XmlSerializer
è disponibile l'interfaccia non documentata IXmlSerializable
, Microsoft si riserva di modificarla o sostituirla con meccanisti alternativi nelle prossime Major Release del .NET Framework quindi va utilizzata con cognizione.
bye (luKa)