Quando utilizzare gli attributi DataContract e DataMember?

Sono molto confuso sull’attributo DataContract in WCF. Per quanto ne so io è usato per serializzare tipi definiti dall’utente come classi. Ho scritto una class 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 DataContract e DataMember funziona anche correttamente. Non riesco a capire perché funzioni correttamente. Qualcuno può dirmi qual è l’uso effettivo di DataContract ?

Il mio contratto di servizio è simile a questo

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

Dal momento che molti programmatori sono stati sopraffatti [DataMember] attributi [DataContract] e [DataMember] , con .NET 3.5 SP1, Microsoft ha fatto in modo che il serializzatore del contratto di dati gestisca tutte le classi, anche senza alcuno di questi attributi, proprio come il vecchio serializzatore XML.

Pertanto, a partire da .NET 3.5 SP1, non è più necessario aggiungere gli attributi dei dati o del membro dati – in caso contrario, il serializzatore del contratto di dati serializzerà tutte le proprietà pubbliche sulla class, proprio come farebbe il serializzatore XML.

TUTTAVIA: non aggiungendo questi attributi, perdi molte funzionalità utili:

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

Quindi per una soluzione “quick’n’dirty”, lasciando gli attributi [DataContract] e [DataMember] funzioneranno – ma è comunque una buona idea averli nelle classi di dati – solo per essere più espliciti su cosa sei facendo, e per darti accesso a tutte quelle funzionalità aggiuntive che non puoi ottenere senza di loro …

In termini di WCF, possiamo comunicare con il server e il client attraverso i messaggi. Per il trasferimento di messaggi e da un potenziale di sicurezza, è necessario creare un dato / messaggio in un formato serializzato.

Per la serializzazione dei dati utilizziamo gli attributi [datacontract] e [datamember]. Nel tuo caso se stai usando datacontract WCF usa DataContractSerializer else WCF usa XmlSerializer che è la tecnica di serializzazione predefinita.

Lasciatemi spiegare in dettaglio:

fondamentalmente WCF supporta 3 tipi di serializzazione:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : – L’ordine predefinito è uguale alla class

DataContractSerializer / NetDataContractSerializer : – L’ordine predefinito è Alfabetico

XmlSerializer : – Lo schema XML è esteso

DataContractSerializer / NetDataContractSerializer : – XML ​​Schema is Constrained

XmlSerializer : – Supporto per il controllo delle versioni non ansible

DataContractSerializer / NetDataContractSerializer : – Il supporto per il controllo delle versioni è ansible

XmlSerializer : – Compatibilità con ASMX

DataContractSerializer / NetDataContractSerializer : – Compatibilità con .NET Remoting

XmlSerializer : – Attributo non richiesto in XmlSerializer

DataContractSerializer / NetDataContractSerializer : – Attributo richiesto in questa serializzazione

quindi quello che usi dipende dalle tue esigenze …

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 ogni parametro o tipo di ritorno, quali dati vengono serializzati (convertiti in XML) per essere scambiati.

Windows Communication Foundation (WCF) utilizza un motore di serializzazione chiamato Data Contract Serializer per impostazione predefinita per serializzare e deserializzare i dati (convertirlo in e da XML). Tutti i tipi primitivi di .NET Framework, come interi e stringhe, nonché determinati tipi trattati come primitive, come DateTime e XmlElement, possono essere serializzati senza altra preparazione e sono considerati come contratti di dati predefiniti. Molti tipi di .NET Framework hanno anche contratti dati esistenti.

Puoi trovare l’articolo completo qui.

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

Il contratto dati può essere esplicito o implicito. Il tipo semplice come int, string ecc ha un contratto di dati implicito. L’object definito dall’utente è un tipo esplicito o Complesso, per il quale è necessario definire un contratto Data utilizzando l’attributo [DataContract] e [DataMember].

Un contratto di dati può essere definito come segue:

  • Descrive il formato esterno dei dati passati ae dalle 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 in che modo i tipi di dati sono serializzati e deserializzati. Attraverso la serializzazione, si converte un object in una sequenza di byte che può essere trasmessa su una rete. Attraverso la deserializzazione, si riassembla un object 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.

  1. Contratto dati: specifica che la class dell’entity framework è pronta per il processo di serializzazione.

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

Anche quando chiami da una richiesta http funzionerà correttamente ma quando proverai a chiamare da net.tcp quella volta avrai tutte queste cose gentili

L’attributo DataMember non è obbligatorio da aggiungere alla serializzazione dei 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, isrequired che non possono essere utilizzate in altro modo.