Condividi tramite


Classe System.Runtime.Serialization.DataContractAttribute

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Applicare l'attributo DataContractAttribute ai tipi (classi, strutture o enumerazioni) utilizzati nelle operazioni di serializzazione e deserializzazione da parte di DataContractSerializer. Se si inviano o si ricevono messaggi usando l'infrastruttura windows Communication Foundation (WCF), è necessario applicare anche a DataContractAttribute tutte le classi che contengono e modificano i dati inviati nei messaggi. Per altre informazioni sui contratti dati, vedere Uso di contratti dati.

È inoltre necessario applicare l'oggetto DataMemberAttribute a qualsiasi campo, proprietà o evento che contiene valori da serializzare. Applicando il DataContractAttribute, si abilita in modo esplicito il DataContractSerializer a serializzare e deserializzare i dati.

Attenzione

È possibile applicare DataMemberAttribute a campi privati. Tenere presente che i dati restituiti dal campo (anche se sono privati) vengono serializzati e deserializzati e pertanto possono essere visualizzati o intercettati da un utente malintenzionato o da un processo.

Per altre informazioni sui contratti dati, vedere gli argomenti elencati in Uso di contratti dati.

Contratti dati

Un contratto dati è una descrizione astratta di un set di campi con un nome e un tipo di dati per ogni campo. Il contratto dati esiste al di fuori di qualsiasi singola implementazione per consentire l'interoperabilità dei servizi su piattaforme diverse. Se i dati passati tra i servizi sono conformi allo stesso contratto, tutti i servizi possono elaborare i dati. Questa elaborazione è nota anche come sistema ad accoppiamento libero. Un contratto dati è anche simile a un'interfaccia in quanto il contratto specifica il modo in cui i dati devono essere recapitati in modo che possano essere elaborati da un'applicazione. Ad esempio, il contratto dati può richiedere un tipo di dati denominato "Person" con due campi di testo, denominato "FirstName" e "LastName". Per creare un contratto dati, applicare DataContractAttribute alla classe e DataMemberAttribute a tutti i campi o alle proprietà che devono essere serializzati. In caso di serializzazione, i dati sono conformi al contratto dati integrato in modo implicito nel tipo .

Annotazioni

Un contratto di dati differisce in modo significativo da un'interfaccia reale per comportamento di ereditarietà. Le interfacce vengono ereditate da qualsiasi tipo derivato. Quando si applica a DataContractAttribute una classe base, i tipi derivati non ereditano l'attributo o il comportamento. Tuttavia, se un tipo derivato ha un contratto dati, i membri dati della classe di base vengono serializzati. Tuttavia, è necessario applicare DataMemberAttribute ai nuovi membri in una classe derivata per renderli serializzabili.

Documenti di XML Schema e lo strumento SvcUtil

Se si scambiano dati con altri servizi, è necessario descrivere il contratto dati. Per la versione corrente di DataContractSerializer, è possibile usare un XML Schema per definire i contratti dati. Altri tipi di metadati/descrizione possono essere usati per lo stesso scopo. Per creare uno schema XML dall'applicazione, usare lo strumento utilità metadati ServiceModel (Svcutil.exe) con l'opzione della riga di comando /dconly . Quando l'input dello strumento è un assembly, per impostazione predefinita, lo strumento genera un set di XML Schema che definiscono tutti i tipi di contratto dati trovati in tale assembly. Al contrario, è anche possibile usare lo strumento Svcutil.exe per creare definizioni di classi Visual Basic o C# conformi ai requisiti di XML Schema che usano costrutti che possono essere espressi dai contratti dati. In questo caso, l'opzione della riga di comando /dconly non è obbligatoria.

Se l'input dello strumento Svcutil.exe è uno schema XML, per impostazione predefinita, lo strumento crea un set di classi. Se si esaminano le classi, si scopre che il DataContractAttribute è stato applicato. È possibile usare queste classi per creare una nuova applicazione per elaborare i dati che devono essere scambiati con altri servizi.

È anche possibile eseguire lo strumento su un endpoint che restituisce un documento WSDL (Web Services Description Language) per generare automaticamente il codice e la configurazione per creare un client Windows Communication Foundation (WCF). Il codice generato include tipi contrassegnati con .DataContractAttribute

Riutilizzare i tipi esistenti

Un contratto dati ha due requisiti di base: un nome stabile e un elenco di membri. Il nome stabile è costituito dall'URI (Uniform Resource Identifier) dello spazio dei nomi e dal nome locale del contratto. Per impostazione predefinita, quando si applica a DataContractAttribute una classe, usa il nome della classe come nome locale e lo spazio dei nomi della classe (preceduto da "http://schemas.datacontract.org/2004/07/") come URI dello spazio dei nomi. È possibile eseguire l'override delle impostazioni predefinite impostando le Name proprietà e Namespace . È anche possibile modificare lo spazio dei nomi applicando ContractNamespaceAttribute allo spazio dei nomi. Usare questa funzionalità quando si dispone di un tipo esistente che elabora i dati esattamente come richiesto, ma ha uno spazio dei nomi e un nome di classe diversi dal contratto dati. Eseguendo l'override dei valori predefiniti, è possibile riutilizzare il tipo esistente e avere i dati serializzati conformi al contratto dati.

Annotazioni

In qualsiasi codice è possibile usare la parola DataContract anziché quella più lunga DataContractAttribute.

Controllo delle versioni

Un contratto dati può anche contenere versioni successive di se stesso. Ovvero, quando una versione successiva del contratto include dati aggiuntivi, tali dati vengono archiviati e restituiti a un mittente non interessato. A tale scopo, implementare l'interfaccia IExtensibleDataObject .

Per altre informazioni sul controllo delle versioni, vedere Controllo delle versioni del contratto dati.