¿Es posible reemplazar dataContractSerializer en Windows Communication Foundation con mi propio serializador? Si es posible, ¿cómo puedo lograr esto?WCF DataContractSerializer personalizado
Respuesta
Sí, puede proporcionar su propia implementación de serializador. Por defecto, WCF usará el DataContractSerializer
. Para proporcionar su propio serializador, debe escribir su propio IOperationBehavior
que busque y elimine el DataContractSerializerOperationBehavior
actualmente aplicado de la colección OperationDescription::Behaviors
y luego aplique una instancia personalizada de DataContractSerializerOperationBehavior
. El DataContractSerializerOperationBehavior es responsable de construir una implementación de XmlObjectSerializer
en sus métodos de fábrica CreateSerializer
. Para algunos ejemplos de código sobre cómo hacer esto, check out this article by Dan Rigsby.
A partir de ahí, se trata de implementar su propio XmlObjectSerializer
personalizado que le permitirá serializar el infoset XML a cualquier representación que desee.
Normalmente se coloca el atributo [DatacontractSerializer]
o [XmlSerializer]
por encima del contrato de servicio, estoy bastante seguro de que podría crear su propio punto por qué se las aplica como atributos, ahora si sólo se reflector comenzaría modo que pudiera inspeccionar el XmlSerializer y descubrir lo que lo hace funcionar
msdn insisten en que las clases que quieren ser serializado a través de la XmlSerializer, deben ser decorados con [XmlAttribute]
o [XmlElement]
atributos (ya que daría más forma al archivo XML con entendimiento), pero funciona si sus clases están decoradas con el [DataMember]
, que es compatible con DataContractSerializer, por lo que debería poder crear su propio serializador que serialice cualquier cosa con una etiqueta [DataMember], como el XmlSerializer
El equipo de WCF hizo esto cuando introdujeron DataContractJsonSerializer.
Hay lejanos puntos de contacto más que los que se mencionan aquí en las otras dos respuestas - por ejemplo, puede que tenga que introducir y cambiar los comportamientos de operación y formateadores de operación que se utiliza, añadir un nuevo codificador, y añadir completamente nuevo servicio y comportamiento del cliente también. Depende de qué es el nuevo formato de serialización y de lo que intenta hacer.
Sin embargo, si su objetivo es solo agregar un nuevo serializador para la serialización independiente, es más simple.
Lo que recomendaría es - observe el uso diferente de DataContractJsonSerializer (a través de Reflector) en System.Runtime.Serialization.dll, System.ServiceModel.Web.dll y System.Runtime.ServiceModel.dll.
Si solo le interesa el aspecto de serialización independiente, simplemente mire DataContractJsonSerializer y las clases asociadas en el espacio de nombres de serialización. Debería ser bastante intuitivo para usted comprender las diversas sutilezas de la implementación de serialización personalizada. Pregunte si tiene preguntas específicas, pero realmente creo que esta es la manera más rápida y elegante de aprender esta solución en particular ...
- 1. WCF service dataContractSerializer maxItemsInObjectGraph en web.config
- 2. WCF serializador personalizado
- 3. error DataContractSerializer utilizando Entity Framework 4.0 con WCF 4.0
- 4. Cómo especificar SoapAction personalizado para WCF
- 5. Devolver la excepción de error personalizado WCF
- 6. DataContractSerializer vs BinaryFormatter rendimiento
- 7. NetDataContractSerializer vs DataContractSerializer
- 8. DataContractSerializer no deserializa referencias
- 9. serialización personalizada con DataContractSerializer
- 10. DataContractSerializer, KnownType y herencia
- 11. ¿WCF y DataContractSerializer serializan de forma diferente los tipos de colección CollectionDataContract?
- 12. cómo hacer que el servicio WCF use una sobrecarga de constructor DataContractSerializer específica?
- 13. Predefinir espacios de nombres XML para DataContractSerializer
- 14. - Cuándo utilizar DataContractSerializer/Binario/XMLSerialiser
- 15. DataContractSerializer no admite matrices rectangulares
- 16. Cómo configurar StreamingContext para DataContractSerializer?
- 17. programas especifique la autorización personalizado de WCF (NetTcpBinding)
- 18. Objeto personalizado que devuelve como "vacío" de WCF?
- 19. Cómo escribir un transporte personalizado basado en socket para WCF
- 20. Validación de certificado personalizado en el servicio WCF
- 21. Enlazar un WSDL personalizado a un servicio WCF existente
- 22. WCF Web Service Error de excepción personalizado al cliente
- 23. Validador de WCF personalizado: cómo inicializar un objeto "Usuario" del validador personalizado
- 24. ¿DataContractSerializer no llama a mi constructor?
- 25. Detener DataContractSerializer poniendo en espacio de nombres?
- 26. DataContractSerializer: ¿por qué no eliminar miembros?
- 27. Problema DataContractSerializer con campos de eventos/delegados
- 28. Formateo de XML creado por DataContractSerializer
- 29. ¿Cómo escribe DataContractSerializer en campos privados?
- 30. Linq a Xml VS XmlSerializer VS DataContractSerializer
Hola Drew, Pero, ¿mi serializador debe derivarse de una clase base o implementar alguna interfaces. Si la respuesta es sí, ¿qué es esto? ¿El serializador tiene que ser una especie de xmlserializer? Escribí un serializador que serializa tipos como bytes. – mkus
Debe heredar de XmlObjectSerializer y proporcionar una implementación propia para los diversos métodos. –
Esta es una pregunta anterior, pero creo que debería agregar que este artículo de msdn advierte sobre la modificación de OperationDescription de un método IOperationBehavior http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior. aspx. – insipid