Questo è un post introduttivo per i post seguenti questo argomento.
DataContract - Serializzazione
L’attributo DataContract è uno dei primi con cui si ha a che fare nel momento in cui si inizierà a scrivere un servizio WCF.
All’interno di un servizio WCF i dati possono avere una certa complessità; quando, gli stessi, vengono spediti vengono rappresentati
tramite un XML Schema Definition (XSD).
DataContract è il mezzo usato da WCF per mappare i tipi .NET CLR con le loro rappresentazioni XSD.
Il decoratore [DataContract] è usato per specificare quale classe deve essere specificata nell’XSD e esposto nell’WSDL esposto dal servizio.
Il decoratore [DataMember] è usato invece per specificare quali membri della classe devono essere specificati nell’XSD.
A runtime la classe DataContractSerializer serializza l’oggetto in XML usanto le regole specificate con gli attributi [DataContract] e [DataMember].
Ecco un esempio, questa è la nostra classe:
Code Snippet
- [DataContract]
- public class CompositeType
- {
- bool boolValue = true;
- string stringValue = "Hello ";
- [DataMember]
- public bool BoolValue
- {
- get { return boolValue; }
- set { boolValue = value; }
- }
- [DataMember]
- public string StringValue
- {
- get { return stringValue; }
- set { stringValue = value; }
- }
- }
Questo l’WSDL ottenuto:
Code Snippet
- <GetDataUsingDataContractResponse xmlns="http://tempuri.org/">
- < GetDataUsingDataContractResult xmlns:a="http://schemas.datacontract.org/2004/07/WcfService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
- < a:BoolValue>false</a:BoolValue>
- < a:StringValue>Hello </a:StringValue>
- </ GetDataUsingDataContractResult>
- </ GetDataUsingDataContractResponse>
In definitiva, la classe DataContractAttribute == [DataContract] specifica o implementa il tipo dei dati da serializzare tramite un serializer, ad esempio tramite la classe DataContractSerializer.
Per Serializzazione solitamente si descrive il processo di conversione di un oggetto in un array di bytes; tale processo viene usato per salvare lo stato di un oggetto su un file o su un database,
copiare lo stato sul clipboard, per trasferire l’oggetto tra un’applicazione ad un’altra tramire un network e per migliorarne la mantenibilità.
Con WCF, serializzare, si intende come un oggetto .NET e mappato nell’XML Infosets.
WCF supporta 3 serializer: XmlSerializer, DataContractSerializer e NetDataContractSerializer.
Tutte e 3 hanno possiedono un algoritmo di mapping diverso, ma lo scopo è sempre lo stesso: mappare gli oggetti .NET in XML Infosets.
Encoding
Abbiamo appena finito di descrivere la Serializzazione ed adesso possiamo capire che distinzione fa WCF con l’Encoding.
Encoding è il termine usato per descrivere il processo di conversione di un messaggio in un array di bytes.
WCF supporta cinque tipi di formati di encoding:
- binary
- text
- Message Transmission Optimization Mechanism (MTOM)
- JavaScript Objeect Notation
- Plain-Old-XML (POX)
Quale di questi formati usare, dipende dal tipo di applicazione che stiamo sviluppando.
Ad esempio vorremmo usare il BinaryMessageEncoder per ottimizzare le performance tra le applicazioni, oppure usare TextMessageEncoder o MtomMessageEncoder per mantenere
l’interoperabilità basata sui vecchi servizi WS-* Web Services, o usare JsonMessageEncoder per AJAX
Se provaste a usare encodings diversi per scrivere lo stesso XML Infosets, otterrete N differenti byte streams, comunque rappresenterebbero gli stessi dati.
L’encoding non è considerato parte del contratto del servizio, ma piuttosto una configurazione dell’endpoint.
Conclusione
La separazione tra Serializzazione e Encoding rende possibile la creazione di applicazioni molto flessibili.
Questo è un cavallo di battaglia di WCF, perchè gli da la possibilità di configurarsi con qualsiasi scenario.
Se abbiamo bisogno di performance allora possiamo usare un encoder se invece necessitiamo di interoperabilità allora sceglieremo un formato testuale.
posted @ sabato 4 luglio 2009 01:34