¿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. Devolver la excepción de error personalizado WCF
- 5. Cómo especificar SoapAction personalizado para WCF
- 6. DataContractSerializer, KnownType y herencia
- 7. DataContractSerializer no deserializa referencias
- 8. serialización personalizada con DataContractSerializer
- 9. DataContractSerializer vs BinaryFormatter rendimiento
- 10. NetDataContractSerializer vs DataContractSerializer
- 11. cómo hacer que el servicio WCF use una sobrecarga de constructor DataContractSerializer específica?
- 12. ¿WCF y DataContractSerializer serializan de forma diferente los tipos de colección CollectionDataContract?
- 13. Predefinir espacios de nombres XML para DataContractSerializer
- 14. DataContractSerializer no admite matrices rectangulares
- 15. - Cuándo utilizar DataContractSerializer/Binario/XMLSerialiser
- 16. Cómo configurar StreamingContext para DataContractSerializer?
- 17. Objeto personalizado que devuelve como "vacío" de WCF?
- 18. Validación de certificado personalizado en el servicio WCF
- 19. Enlazar un WSDL personalizado a un servicio WCF existente
- 20. programas especifique la autorización personalizado de WCF (NetTcpBinding)
- 21. Cómo escribir un transporte personalizado basado en socket para WCF
- 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. Formateo de XML creado por DataContractSerializer
- 25. ¿Por qué DataContractSerializer to StringWriter está truncado?
- 26. Detener DataContractSerializer poniendo en espacio de nombres?
- 27. Linq a Xml VS XmlSerializer VS DataContractSerializer
- 28. ¿Cómo escribe DataContractSerializer en campos privados?
- 29. Deserializar clase heredada con DataContractSerializer (typeof (BaseClass))
- 30. DataContractSerializer: ¿por qué no eliminar miembros?
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