2009-12-28 11 views

Respuesta

8

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.

+0

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

+0

Debe heredar de XmlObjectSerializer y proporcionar una implementación propia para los diversos métodos. –

+0

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

2

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

3

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 ...

Cuestiones relacionadas