2010-10-19 26 views
2

je viens de faire quelques tests et j'ai manged pour obtenir ReadAsDataContract travailler sur la méthode Response.Content ...WCF REST: ReadAsDataContract en utilisant des classes « SANS » attributs décoration DataContract et DataMember

La seule chose qui est vraiment déroutant c'est que je pensais que ça ne devrait pas marcher! Comme mes classes ne sont pas décorées avec les attributs DataContact ou DataMember.

Je suis confus, la lecture des différents tutoriels sur le web, il semble qu'il est important pour décorer votre classe (utilisée pour ReadAsDataContract) avec des attributs DataContract et DataMember ..

mais le mien est pas et je peux mettre un point d'arrêt sur la ligne qui appelle ReadAsDataContract et bien sûr j'ai un LIST retourné avec les détails corrects. Voici la ligne

List<Models.Question> questions = response.Content.ReadAsDataContract<List<Models.Question>>(); 

Models.Question n'est pas décorée avec les attributs. Je partage mon modèle avec mon serveur et mon client.

Quelqu'un peut-il me dire pourquoi cela fonctionne quand pour autant que je sais que vous devez ajouter les attributs de la classe et les membres (dont je ne)

J'utilise Visual Studio 2010 et .NET 4 - ermmm il me semble me souvenir que ces attributs ne sont plus nécessaires - est-ce vrai?

Vraiment hâte de toute aide.

Je déteste quand les choses fonctionnent et ils ne devraient pas :-) mais bien sûr, je déteste aussi quand ce NE FONCTIONNE PAS quand ils devraient :-)

thanks!

Répondre

3

Quelqu'un peut-il me dire pourquoi cela fonctionne quand pour autant que je sais que vous devez ajouter les attributs de la classe et les membres (dont je ne)

Il semble que le « fardeau «mettre [DataContract] sur des classes de données et [DataMember] sur chaque membre à sérialiser était trop pour les programmeurs du monde entier - alors Microsoft a changé le comportement de DataContractSerializer dans .NET 3.5 SP1.

Depuis lors, le DCS se comportera comme l'ancien XmlSerializer avec une classe qui n'est pas décorée - il sera heureux de sérialiser tous les membres publics et les propriétés. Problème avec cela, bien sûr: vous perdez tout le contrôle supplémentaire que les attributs vous donnent, comme définir un espace de noms XML pour vos contrats de données, définir l'ordre des membres de données, etc. - mais cela fonctionne sans ajouter de les attributs.

Il s'agit donc d'un comportement connu et volontairement introduit. Je crois toujours que vous devez être explicite dans vos intentions et marquer vos classes de données avec [DataContract] et vos membres avec [DataMember] (ce qui vous permet également d'ignorer un ou plusieurs membres publics et de ne pas les inclure dans la sérialisation).

+0

Merci Marc pour une explication détaillée. Très appréciée – Martin

1

Selon this tous les types peuvent être sérialisés, pas seulement ceux avec le DataContractAttribute.

+0

Oui en effet c'est .. merci pour le commentaire. – Martin