DataContractSerializer: Comment sérialiser des classes / membres sans attributs DataContract / DataMember

datacontractserializer efpocoadapter entity-framework serialization

Question

DataContractSerializer nécessite que les classes et les membres soient marqués avec les DataContract et DataMember . Cependant, dans mon cas, les classes sont générées automatiquement avec le framework EFPocoAdapater et ces attributs ne sont pas présents.

Comment puis-je forcer la sérialisation de tous les membres à l'aide de DataContractSerializer sans que ces attributs soient présents?

De Alexdej:

Cela a changé dans 3.5SP1, j'espère que vous avez vu cela: http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx

Réponse acceptée

Vous ne pouvez pas - clair et simple. Les attributs sont nécessaires pour que DataContractSerializer puisse sélectionner les éléments à sérialiser. Dans le contrat avec XmlSerializer, qui ne fait que tout sérialiser (sauf si vous lui indiquez explicitement de l'ignorer), DataContractSerializer est "opt-in" - vous devez lui indiquer explicitement (à l'aide des attributs) quels champs et / ou propriétés sérialiser.

UPDATE: Comme plusieurs personnes l'ont souligné, avec .NET 3.5 SP1, Microsoft a légèrement assoupli ces règles. Toute propriété publique en lecture / écriture sera sérialisée automatiquement par DataContractSerializer. Dans le même temps, votre classe doit également avoir un constructeur par défaut sans paramètre - cela ressemble exactement aux exigences que nous avions pour XmlSerializer quand ....

Bien sûr, ceci:

  • ne vous autorise pas à sérialiser quelque chose de privé - si vous voulez le sérialiser, vous devez l'exposer en tant que propriété de lecture / écriture publique
  • ne vous permet pas de spécifier un ordre choisi défini des paramètres - il les utilisera simplement dans l'ordre dans lequel ils apparaissent dans la classe
  • exige maintenant que vous ayez à nouveau un constructeur sans paramètre dans votre classe pour la désérialisation

Je pense toujours que ces éléments doivent être explicites et clairs, de sorte que ceux qui ne sont plus nécessaires ouvrent la voie à une programmation paresseuse / négligente - je ne l’aime pas Mais si vous le souhaitez, vous pouvez l’utiliser maintenant sans marquer explicitement vos propriétés avec [DataMember] .....

Marc


Réponse populaire

Il suffit de marquer la classe avec l'attribut [Serializable]. Tous les membres pour lesquels vous ne souhaitez pas que la marque soit sérialisée avec [NonSerialized]. Notez que [Serializable] entraîne la sérialisation de tous les champs par défaut, [DataContract] ne sérialisant aucun champ par défaut, à l'exception de ceux marqués avec [DataMember].



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow