DataContractSerializer: Comment sérialiser les classes et membres DataContract/attributs DataMember
DataContractSerializer
nécessite de classes et de membres pour être marqué avec le DataContract
et DataMember
attributs. Cependant, dans mon cas, les classes sont générées automatiquement avec le EFPocoAdapater cadre et ces attributs ne sont pas présents.
Comment puis-je la force de la sérialisation de tous les membres qui utilisent le DataContractSerializer sans ces attributs présent?
De Alexdej:
Ce qui a changé en 3.5SP1, espère que vous avez vu
que:
http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx
OriginalL'auteur aleemb | 2009-04-24
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas tout simplement. L'attribut sont nécessaires pour le DataContractSerializer pour ramasser les éléments à sérialiser. Dans le contrat pour le XmlSerializer, qui est fondamentalement juste sérialise tout (sauf si vous avez explicitement dire de l'ignorer), le DataContractSerializer est "opt-in" - vous devez indiquer explicitement (par le biais des attributs) les champs et/ou des propriétés à sérialiser.
Mise à JOUR: Que plusieurs gens l'ont souligné, avec .NET 3.5 SP1, Microsoft assoupli ces règles un peu - tout public propriété en lecture/écriture sera sérialisée automatiquement par le DataContractSerializer. Dans le même temps, votre classe doit également avoir un constructeur par défaut sans paramètre - sons comme les conditions exactes nous avons eu pour le XmlSerializer chemin du retour quand....
Bien sûr, ce:
Je pense toujours que ces chose doit être explicite et claire, ce qui rend ceux qui ne sont plus nécessaires ouvre le chemin pour les paresseux/bâclée de programmation - je ne l'aime pas. Mais si vous voulez, vous pouvez maintenant l'utiliser sans explicitement le marquage de vos propriétés avec [DataMember].....
Marc
Eh bien, j'ai été lire un peu plus sur ce sujet aujourd'hui, et ici j'ai trouvé que si vos classes utilisées par le DataContractSerializer sont marqués avec [Serializable], alors par défaut, elles seront sérialisés un peu comme à l'ancienne, de style SAVON formateur - CHAQUE champ quelle que soit la visibilité est inclus. Peut-être vous aider peut-être?
Enfin pas vraiment parce que mon problème c'est que je ne peux pas toucher les classes auto-générées et j'ai besoin d'être en mesure à l'extérieur de l'ignorer champs. Je suis à l'aide de projections dans mes requêtes linq pour contourner cela maintenant, ce qui fonctionne très bien.
Cette réponse n'est plus correct (voir alexdej de réponse). Depuis qu'il est accepté, il doit probablement être modifié pour refléter les changements dans les 3.5SP1.
Je pense toujours que c'est mieux d'avoir ces choses CLAIREMENT et EXPLICITEMENT dans votre code. Mais vous avez raison - avec 3.5 SP1, il n'est plus nécessaire..... (bienvenue bâclée de programmation!)
OriginalL'auteur marc_s
Je crois que c'est possible. Si vous implémentez l'interface ISerializable puis le sérialiseur les utilisateurs de votre mise en place des attributs. Bien que je pense que vous aurez encore à marquer la classe [Serializable].
Ses un peu plus de travail que d'ajouter des attributs, mais il ne fonctionne pas.
OriginalL'auteur Jon Mitchell
Juste la marque de la classe avec l'attribut [Serializable].
Tout les membres que vous ne voulez pas sérialisé marque avec [NonSerialized]. Notez que [Serializable] les causes de tous les domaines pour être sérialisé par défaut, où [DataContract] sérialisé pas de champs par défaut, à l'exception de ceux marqués par [DataMember].
OriginalL'auteur ahzz