Question

Est-il possible de remplacer DataContractSerializer dans Windows Communication Foundation avec mon propre sérialiseur. S'il est possible, comment puis-je y parvenir?

Était-ce utile?

La solution

Oui, vous pouvez fournir votre propre implémentation de sérialiseur. Par défaut WCF utilisera le DataContractSerializer . Fournir votre propre sérialiseur vous devez écrire votre propre IOperationBehavior qui recherche et supprime l'application actuellement DataContractSerializerOperationBehavior du la collection de OperationDescription::Behaviors et applique ensuite une instance personnalisée d'un DataContractSerializerOperationBehavior. Le DataContractSerializerOperationBehavior est alors responsable de la construction d'un XmlObjectSerializer mise en œuvre dans son CreateSerializer usine méthodes. Pour certains exemples de code pour la façon de ce faire, consultez cet article par Dan Rigsby .

A partir de là, il est tout au sujet de la mise en œuvre de votre propre XmlObjectSerializer personnalisé qui vous permettra de sérialiser l'infoset XML à toute représentation que vous voulez.

Autres conseils

L'équipe de WCF a fait quand ils ont introduit DataContractJsonSerializer.

Il y a far plus touchpoints que ceux mentionnés ici dans les deux autres réponses - par exemple vous pouvez avoir à introduire et modifier les comportements de fonctionnement et formatteurs de fonctionnement utilisé, ajouter un nouvel encodeur, et d'ajouter entièrement nouveaux comportements de service et des clients ainsi. Cela dépend de ce que le nouveau format de sérialisation est et ce que vous essayez de faire.

Cependant, si votre objectif est d'ajouter seulement une nouvelle sérialiseur pour la sérialisation autonome, il est plus simple.

Ce que je recommande est -. Regarder tous les différents usages de DataContractJsonSerializer (via réflecteur) en System.Runtime.Serialization.dll, System.ServiceModel.Web.dll et System.Runtime.ServiceModel.dll

Si vous êtes intéressé par seulement l'aspect sérialisation autonome, il suffit de regarder à la DataContractJsonSerializer et les classes associées dans l'espace de noms de sérialisation. Il devrait être assez intuitif pour vous de saisir les différentes subtilités de la mise en œuvre de sérialisation personnalisée. Demandez immédiatement si vous avez des questions, mais je crois vraiment que c'est le plus rapide et la plus élégante d'apprendre cette solution particulière ...

Normalement, vous placez le [DatacontractSerializer] d'attribut ou [XmlSerializer] au-dessus du contrat de service, im assez sûr que vous pouvez créer votre propre donc pourquoi vous les appliquez sous forme d'attributs, maintenant, si seulement réflecteur commencerait pour que je puisse inspecter le XmlSerializer et découvrir ce qui fait marcher.

msdn insistent sur le fait que les classes qui veulent être sérialisés par le XmlSerializer, doit être décoré avec des attributs de [XmlAttribute] ou [XmlElement] (car il donnerait plus de forme dans le fichier xml compréhensive), mais il ne fonctionne que si vos classes sont décorées avec le [DataMember], qui est compatible avec DataContractSerializer, donc pourquoi vous devriez être en mesure de créer votre propre sérialiseur qui sérialisation quoi que ce soit avec une étiquette [DataMember], tout comme le XmlSerializer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top