web-dev-qa-db-fra.com

Quand utiliser les attributs DataContract et DataMember?

Je suis très confus à propos de l'attribut DataContract dans WCF. Selon mes connaissances, il est utilisé pour sérialiser le type défini par l'utilisateur comme des classes. J'ai écrit une classe qui est exposée à côté du client comme ceci.

[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; }
}

Il fonctionne correctement mais lorsque je supprime DataContract et DataMember, il fonctionne également correctement. Je ne comprends pas pourquoi cela fonctionne correctement. Quelqu'un peut-il me dire quelle est l'utilisation réelle de DataContract?

Mon contrat de service ressemble à ceci

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

Comme beaucoup de programmeurs étaient submergés par les attributs [DataContract] et [DataMember], avec .NET 3.5 SP1, Microsoft a demandé au sérialiseur de contrat de données de gérer toutes les classes, même sans aucun de ces attributs, à la manière de l'ancien code XML. sérialiseur.

Donc, à partir de .NET 3.5 SP1, vous ne doit pas == ajouter des attributs de contrat de données ou de membre de données - sinon, le sérialiseur de contrat de données sérialisera toutes les propriétés publiques. sur votre classe, comme le ferait le sérialiseur XML.

HOWEVER: en ne ajoutant pas ces attributs, vous perdez beaucoup de fonctionnalités utiles:

  • sans [DataContract], vous ne pouvez pas définir d’espace de nommage XML pour vos données.
  • sans [DataMember], vous ne pouvez pas sérialiser des propriétés ou des champs non publics
  • sans [DataMember], vous ne pouvez pas définir d'ordre de sérialisation (Order=) et le DCS sérialisera toutes les propriétés par ordre alphabétique.
  • sans [DataMember], vous ne pouvez pas définir un nom différent pour votre propriété (Name=)
  • sans [DataMember], vous ne pouvez pas définir d'éléments comme IsRequired= ou d'autres attributs utiles
  • sans [DataMember], vous ne pouvez pas omettre certaines propriétés publiques - toutes les propriétés publiques seront sérialisées par le DCS

Donc, pour une solution "quick'n'dirty", laisser de côté les attributs [DataContract] et [DataMember] fonctionnera - mais c'est toujours une bonne idée de les avoir sur vos classes de données - juste pour être plus explicite à propos de ce que vous faites et de vous donner accès à toutes ces fonctionnalités supplémentaires que vous ne pouvez pas obtenir sans elles ...

341
marc_s

En termes de WCF, nous pouvons communiquer avec le serveur et le client par le biais de messages. Pour transférer des messages, et à partir d'une éventuelle sécurité, nous devons créer un message/données dans un format sérialisé.

Pour la sérialisation des données, nous utilisons les attributs [datacontract] et [datamember]. Dans votre cas, si vous utilisez datacontract WCF utilise DataContractSerializer sinon WCF utilise XmlSerializer qui est la technique de sérialisation par défaut.

Laissez-moi vous expliquer en détail:

en gros, WCF prend en charge 3 types de sérialisation:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer: - L'ordre par défaut est identique à la classe

DataContractSerializer/NetDataContractSerializer: - L'ordre par défaut est alphabétique.

XmlSerializer: - Le schéma XML est étendu

DataContractSerializer/NetDataContractSerializer: - Le schéma XML est contraint

XmlSerializer: - Le support de la gestion des versions n'est pas possible

DataContractSerializer/NetDataContractSerializer: - Le support de la gestion des versions est possible

XmlSerializer: - Compatibilité avec ASMX

DataContractSerializer/NetDataContractSerializer: - Compatibilité avec .NET Remoting

XmlSerializer: - Attribut non requis dans XmlSerializer

DataContractSerializer/NetDataContractSerializer: - Attribut requis pour cette sérialisation

donc ce que vous utilisez dépend de vos besoins ...

13
Pradeep atkari

Un contrat de données est un accord formel entre un service et un client qui décrit de manière abstraite les données à échanger. Autrement dit, pour communiquer, le client et le service ne doivent pas partager les mêmes types, mais les mêmes contrats de données. Un contrat de données définit avec précision, pour chaque paramètre ou type de retour, les données à sérialiser (converties en XML) à échanger.

Windows Communication Foundation (WCF) utilise par défaut un moteur de sérialisation appelé le sérialiseur de contrat de données pour sérialiser et désérialiser les données (les convertir en XML). Tous les types primitifs .NET Framework, tels que les entiers et les chaînes, ainsi que certains types traités comme tels, tels que DateTime et XmlElement, peuvent être sérialisés sans autre préparation et sont considérés comme ayant des contrats de données par défaut. De nombreux types de .NET Framework ont ​​également des contrats de données existants.

Vous pouvez trouver l'article complet ici.

8
mr.b

Un contrat de données est un accord formel entre un service et un client qui décrit de manière abstraite les données à échanger.

Le contrat de données peut être explicite ou implicite. Les types simples tels que int, chaîne, etc. ont un contrat de données implicite. Les objets définis par l'utilisateur sont de type explicite ou complexe, pour lesquels vous devez définir un contrat de données à l'aide des attributs [DataContract] et [DataMember].

Un contrat de données peut être défini comme suit:

  • Il décrit le format externe des données transmises vers et depuis les opérations de service.

  • Il définit la structure et les types de données échangées dans les messages de service

  • Il mappe un type CLR à un schéma XML
  • Il définit comment les types de données sont sérialisés et désérialisés. Grâce à la sérialisation, vous convertissez un objet en une séquence d'octets pouvant être transmis sur un réseau. Grâce à la désérialisation, vous réassemblez un objet à partir d'une séquence d'octets que vous recevez d'une application appelante.
  • C'est un système de gestion de versions qui vous permet de gérer les modifications apportées aux données structurées.

Nous devons inclure la référence System.Runtime.Serialization au projet. Cet ensemble contient les attributs DataContract et DataMember.

2
Kamran
  1. Contrat de données: il spécifie que votre classe d'entités est prête pour le processus de sérialisation.

  2. Membres de données: spécifie que le champ particulier fait partie du contrat de données et peut être sérialisé.

2
Mrunalini

L’attribut DataMember n’est pas obligatoire pour ajouter des données en série. Lorsque l'attribut DataMember n'est pas ajouté, l'ancien XMLSerializer sérialise les données. L'ajout d'un DataMember fournit des propriétés utiles telles que order, name, is requis, qui ne peuvent pas être utilisées autrement.

0
Vijay Mishra

De plus, lorsque vous appelez depuis une requête http, cela fonctionnera correctement, mais lorsque vous tenterez d'appeler depuis net.tcp, vous obtiendrez tout ce genre de choses.

0
Pramod