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);
}
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:
[DataContract]
, vous ne pouvez pas définir d’espace de nommage XML pour vos données.[DataMember]
, vous ne pouvez pas sérialiser des propriétés ou des champs non publics[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.[DataMember]
, vous ne pouvez pas définir un nom différent pour votre propriété (Name=
)[DataMember]
, vous ne pouvez pas définir d'éléments comme IsRequired=
ou d'autres attributs utiles[DataMember]
, vous ne pouvez pas omettre certaines propriétés publiques - toutes les propriétés publiques seront sérialisées par le DCSDonc, 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 ...
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:
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 ...
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.
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
Nous devons inclure la référence System.Runtime.Serialization au projet. Cet ensemble contient les attributs DataContract et DataMember.
Contrat de données: il spécifie que votre classe d'entités est prête pour le processus de sérialisation.
Membres de données: spécifie que le champ particulier fait partie du contrat de données et peut être sérialisé.
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.
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.