Est-il possible de remplacer dataContractSerializer dans Windows Communication Foundation par mon propre sérialiseur. Si c'est possible, comment puis-je y parvenir?Personnalisé WCF DataContractSerializer
Répondre
Oui, vous pouvez fournir votre propre implémentation de sérialiseur. Par défaut, WCF utilisera le DataContractSerializer
. Pour fournir votre propre sérialiseur, vous devez écrire votre propre IOperationBehavior
qui recherche et supprime le DataContractSerializerOperationBehavior
actuellement appliqué de la collection OperationDescription::Behaviors
, puis applique une instance personnalisée d'un DataContractSerializerOperationBehavior
. Le DataContractSerializerOperationBehavior est alors responsable de la construction d'une implémentation XmlObjectSerializer
dans ses méthodes d'usine CreateSerializer
. Pour certains exemples de code pour savoir comment faire cela, check out this article by Dan Rigsby. De là, il s'agit d'implémenter votre propre XmlObjectSerializer
personnalisé qui vous permettra de sérialiser l'infoset XML à n'importe quelle représentation que vous voulez.
Normalement, vous placez l'attribut [DatacontractSerializer]
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 reflector commencerait pour que je puisse inspecter le XmlSerializer et découvrir ce qui le fait tiquer.
msdn insistent sur le fait que les classes qui veulent être sérialisé par le XmlSerializer, doivent être décorés avec [XmlAttribute]
ou [XmlElement]
attributs (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
L'équipe WCF l'a fait en introduisant DataContractJsonSerializer.
Il y a lointain plus de points de contact que ceux mentionnés ici dans les deux autres réponses - par exemple, vous devrez introduire et modifier les comportements de fonctionnement et les formateurs d'opération utilisés, ajouter un nouveau codeur et ajouter le service et les comportements des clients. Cela dépend du nouveau format de sérialisation et de ce que vous essayez de faire. Cependant, si votre objectif est d'ajouter uniquement un nouveau sérialiseur pour la sérialisation autonome, c'est plus simple. Ce que je recommanderais est - regardez toute l'utilisation différente de DataContractJsonSerializer (via Reflector) dans System.Runtime.Serialization.dll, System.ServiceModel.Web.dll et System.Runtime.ServiceModel.dll.
Si vous êtes intéressé uniquement par l'aspect de sérialisation autonome, consultez simplement DataContractJsonSerializer et les classes associées dans l'espace de noms Sérialisation. Il devrait être assez intuitif pour vous de saisir les diverses subtilités de l'implémentation de sérialisation personnalisée. Demandez si vous avez des questions spécifiques, mais je crois vraiment que c'est le moyen le plus rapide et le plus élégant d'apprendre cette solution particulière ...
Hi Drew, Mais mon sérialiseur doit-il être dérivé d'une classe de base ou mettre en œuvre certains interfaces. Si la réponse est oui, quels sont-ils? Le sérialiseur doit-il être une sorte de xmlserializer? J'ai écrit un sérialiseur qui sérialise les types en octets. – mkus
Vous devez hériter de XmlObjectSerializer et fournir votre propre implémentation pour les différentes méthodes. –
Ceci est une question plus ancienne mais je pense que je devrais ajouter que cet article de msdn met en garde contre la modification de l'OperationDescription d'une méthode IOperationBehavior http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior. aspx. – insipid