Quando utilizzare gli attributi DataContract e DataMember?


179

Sono molto confuso sull'attributo DataContractin WCF. Per quanto ne so, viene utilizzato per serializzare tipi definiti dall'utente come le classi. Ho scritto una classe che è esposta sul lato client in questo modo.

[DataContract]
public class Contact
{
    [DataMember]
    public int Roll { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }

    [DataMember]
    public int Age { get; set; }
}

Funziona correttamente ma quando rimuovo DataContracte DataMemberfunziona anche correttamente. Non riesco a capire perché funzioni correttamente. Qualcuno può dirmi qual è l'effettivo utilizzo DataContract?

Il mio contratto di servizio è simile al seguente

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}

Risposte:


361

Poiché molti programmatori sono stati sopraffatti dagli attributi [DataContract]e [DataMember], con .NET 3.5 SP1, Microsoft ha fatto sì che il serializzatore del contratto dati gestisse tutte le classi - anche senza nessuno di questi attributi - proprio come il vecchio serializzatore XML.

Pertanto, a partire da .NET 3.5 SP1, non è più necessario aggiungere ulteriori contratti di dati o attributi dei membri di dati; in caso contrario, il serializzatore del contratto di dati serializzerà tutte le proprietà pubbliche della classe, proprio come farebbe il serializzatore XML.

TUTTAVIA: non aggiungendo tali attributi, si perdono molte funzionalità utili:

  • senza [DataContract], non è possibile definire uno spazio dei nomi XML per i dati in cui vivere
  • senza [DataMember], non è possibile serializzare proprietà o campi non pubblici
  • senza [DataMember], non è possibile definire un ordine di serializzazione ( Order=) e DCS serializzerà tutte le proprietà in ordine alfabetico
  • senza [DataMember], non puoi definire un nome diverso per la tua proprietà ( Name=)
  • senza [DataMember], non è possibile definire cose come IsRequired=o altri attributi utili
  • senza [DataMember], non è possibile tralasciare alcune proprietà pubbliche: tutte le proprietà pubbliche verranno serializzate dal DCS

Quindi, per una soluzione "quick'n'dirty", tralasciando gli attributi [DataContract]e [DataMember]funzionerà, ma è comunque una buona idea averli nelle tue classi di dati, solo per essere più espliciti su ciò che stai facendo e per darti accesso a tutte quelle funzionalità aggiuntive che non ottieni senza di esse ...


intendi per impostazione predefinita che tutti i tipi di dati sono contrassegnati internamente come serializzabili e abbiamo usato DataContract / DataMember per limitarli.
santosh singh,

2
@Santosh: se hai una classe con alcune proprietà pubbliche, queste saranno serializzate dal serializzatore di contratti dati WCF, a meno che tu non applichi esplicitamente [DataContract] / [DataMember] .- allora spetta a te decidere cosa viene serializzato e cosa no
marc_s

36
@Arthis: non è del tutto vero. Come di .NET 3.5 SP1, WCF sarà felicemente classi serializzare senza alcuna [DataContract] e [DataMember]attributi ... ma non appena si inizia utilizzando uno di questi attributi, allora questo comportamento "default" smetterà di funzionare - non appena si dispone di una singola [DataMember] in classe, da quel momento in poi, solo quelle proprietà con questo attributo verranno serializzate.
marc_s,

4
Oohh! Grazie per aver chiarito questo punto! Lo scaverò ancora un po 'allora!
Arthis,

6
Youhou! Spacca!! Grazie mille!
Arthis,

16

In termini di WCF, possiamo comunicare con il server e il client tramite messaggi. Per il trasferimento di messaggi e da un punto di vista della sicurezza, dobbiamo creare un dato / messaggio in un formato serializzato.

Per serializzare i dati utilizziamo gli attributi [datacontract] e [datamember]. Nel tuo caso, se stai usando datacontractWCF usa DataContractSerializeraltrimenti WCF usa XmlSerializerche è la tecnica di serializzazione predefinita.

Lasciami spiegare in dettaglio:

fondamentalmente WCF supporta 3 tipi di serializzazione:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : - L'ordine predefinito è uguale alla classe

DataContractSerializer / NetDataContractSerializer : - L'ordine predefinito è alfabetico

XmlSerializer : - Lo schema XML è esteso

DataContractSerializer / NetDataContractSerializer : - Lo schema XML è vincolato

XmlSerializer : - Supporto versioni non è possibile

DataContractSerializer / NetDataContractSerializer : - È possibile il supporto delle versioni

XmlSerializer : - Compatibilità con ASMX

DataContractSerializer / NetDataContractSerializer : - Compatibilità con .NET Remoting

XmlSerializer : - Attributo non richiesto in XmlSerializer

DataContractSerializer / NetDataContractSerializer : - Attributo richiesto in questa serializzazione

quindi ciò che usi dipende dalle tue esigenze ...


8

Un contratto di dati è un accordo formale tra un servizio e un cliente che descrive in modo astratto i dati da scambiare. Cioè, per comunicare, il cliente e il servizio non devono condividere gli stessi tipi, solo gli stessi contratti di dati. Un contratto di dati definisce con precisione, per ciascun parametro o tipo di ritorno, quali dati vengono serializzati (trasformati in XML) da scambiare.

Windows Communication Foundation (WCF) utilizza un motore di serializzazione chiamato serializzatore di contratti di dati per impostazione predefinita per serializzare e deserializzare i dati (convertirli in e da XML). Tutti i tipi primitivi di .NET Framework, come numeri interi e stringhe, nonché alcuni tipi trattati come primitivi, come DateTime e XmlElement, possono essere serializzati senza altra preparazione e si ritiene che abbiano contratti di dati predefiniti. Molti tipi di .NET Framework hanno anche contratti di dati esistenti.

Puoi trovare l'articolo completo qui.


2
È tutto vero e va bene, ma in realtà non risponde alla domanda dell'OP sul perché il serializzatore del contratto dati funzioni anche senza alcun attributo [DataContract] e [DataMember] sulle tue classi ....
marc_s

Qualcuno può dirmi qual è l'uso effettivo di DataContract? - Penso che almeno una parte della domanda abbia una risposta.
Estratto del

2

Un contratto di dati è un accordo formale tra un servizio e un cliente che descrive in modo astratto i dati da scambiare.

Il contratto sui dati può essere esplicito o implicito. I tipi semplici come int, string etc hanno un contratto dati implicito. Gli oggetti definiti dall'utente sono di tipo esplicito o complesso, per i quali è necessario definire un contratto dati utilizzando l'attributo [DataContract] e [DataMember].

Un contratto dati può essere definito come segue:

  • Descrive il formato esterno dei dati trasmessi da e verso le operazioni di servizio

  • Definisce la struttura e i tipi di dati scambiati nei messaggi di servizio

  • Associa un tipo CLR a uno schema XML
  • Definisce come i tipi di dati vengono serializzati e deserializzati. Tramite la serializzazione, si converte un oggetto in una sequenza di byte che possono essere trasmessi su una rete. Attraverso la deserializzazione, si ricompone un oggetto da una sequenza di byte che si riceve da un'applicazione chiamante.
  • È un sistema di controllo delle versioni che consente di gestire le modifiche ai dati strutturati

Dobbiamo includere il riferimento System.Runtime.Serialization al progetto. Questo assembly contiene l'attributo DataContract e DataMember.


2
  1. Contratto dati: specifica che la classe di entità è pronta per il processo di serializzazione.

  2. Membri dei dati: specifica che il campo specifico fa parte del contratto di dati e può essere serializzato.


0

Anche quando chiami dalla richiesta http funzionerà correttamente ma quando provi a chiamare da net.tcp quella volta ottieni tutte queste cose gentili


0

L'attributo DataMember non è obbligatorio da aggiungere per serializzare i dati. Quando l'attributo DataMember non viene aggiunto, il vecchio XMLSerializer serializza i dati. L'aggiunta di un DataMember fornisce proprietà utili come ordine, nome, che non possono essere utilizzate diversamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.