190 votes

Quand utiliser les attributs DataContract et DataMember?

Je suis très confus au sujet de l' DataContract d'attribut dans WCF. Selon mes connaissances, il est utilisé pour la sérialisation de type défini par l'utilisateur, telles que les classes. J'écris une classe qui est de l'exposer à côté client.

[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 retire DataContract au niveau de la classe ainsi que DataMember il est également fonctionner correctement. Je ne peux pas comprendre que si elle fonctionne correctement alors pourquoi il est nécessaire d' DataContract? Quelqu'un peut-il me dire qu'est-ce que l'utilisation réelle de l' DataContract?

Mon contrat de service ressemble à ceci

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

377voto

marc_s Points 321990

Depuis beaucoup de programmeurs ont été débordés par l' [DataContract] et [DataMember] attributs, avec .NET 3.5 SP1, Microsoft a fait le contrat de données sérialiseur gérer toutes les classes - même, sans aucune de ces attributs - un peu comme le vieux sérialiseur XML.

Afin d' .NET 3.5 SP1, vous ne pas avoir à ajouter de contrat de données ou de données d'attributs de membre plus - si vous n'avez pas le cas, alors le contrat de données sérialiseur va sérialiser toutes les propriétés publiques sur votre classe, tout comme le sérialiseur XML serait.

CEPENDANT: ne pas ajouter de ces attributs, vous perdez beaucoup de capacités utiles:

  • sans [DataContract], vous ne pouvez pas définir un espace de noms XML pour que vos données puissent vivre dans
  • sans [DataMember], vous ne pouvez pas sérialiser non-propriétés publiques ou dans les champs
  • sans [DataMember], vous ne pouvez pas définir un ordre de sérialisation (Order=) et le DCS va sérialiser toutes les propriétés par ordre alphabétique
  • sans [DataMember], vous ne pouvez pas définir un autre nom pour votre propriété (Name=)
  • sans [DataMember], vous ne pouvez pas définir les choses comme IsRequired= ou d'autres attributs utiles
  • sans [DataMember], vous ne pouvez pas laisser certaines propriétés publiques - toutes les propriétés publiques sera sérialisé par les contrôleurs de domaine

Donc pour un "quick n'dirty" solution, en laissant à l'écart de l' [DataContract] et [DataMember] attributs travail mais c'est toujours une bonne idée de les avoir sur vos classes de données - pour être plus explicite sur ce que vous êtes en train de faire, et de vous donner accès à toutes ces fonctionnalités supplémentaires que vous n'obtenez pas sans eux...

8voto

Shen Lance Points 1059

Un contrat de données est un accord formel entre un service et un client qui décrit de façon abstraite l'échange de données. C'est, pour communiquer, le client et le service n'ont pas à partager les mêmes formes, les mêmes contrats de données. Un contrat de données définit précisément, pour chaque paramètre ou le type de retour, les données sont sérialisées (transformé en XML) d'échange.

Windows Communication Foundation (WCF) utilise un moteur de sérialisation appelé le Contrat de Données Sérialiseur par défaut pour sérialiser et désérialiser des données (le convertir et à partir de XML). Tous les .NET Framework types primitifs, tels que des entiers et des chaînes, ainsi que certains types de traités comme des primitifs, tels que DateTime et XmlElement, peut être sérialisé avec aucune autre préparation et sont considérés comme ayant de données par défaut des contrats. Beaucoup de .NET Framework types ont également des données existantes contrats.

Vous pouvez trouver l'article complet ici.

0voto

Pramod Points 11

Aussi lorsque vous appelez de la requête http il ne fonctionnera pas correctement mais lorsque votre essai d’appeler depuis net.tcp que fois que vous obtenir tous ce genre de choses aimable

-1voto

Vishal Patel Points 745

Peut-être il sera utile pour vous...

http://wcftutorial.NET/Data-Contract.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X