Personalizado WCF DataContractSerializer

¿Es posible reemplazar dataContractSerializer en Windows Communication Foundation con mi propio serializador? Si es posible, ¿cómo puedo lograr esto?

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 busca y elimina el DataContractSerializerOperationBehavior aplicado actualmente de la colección OperationDescription::Behaviors y luego aplica 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 ver ejemplos de cómo hacerlo, consulte este artículo de 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.

El equipo de WCF hizo esto cuando introdujeron DataContractJsonSerializer.

Hay muchos más puntos de contacto 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 los formateadores de operaciones que se utilizan, agregar un nuevo codificador y agregar comportamientos completamente nuevos del servicio y del cliente. . Depende de qué es el nuevo formato de serialización y de lo que intenta hacer.

Sin embargo, si su objective 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 forma más rápida y elegante de aprender esta solución en particular …

Normalmente [DatacontractSerializer] el atributo [DatacontractSerializer] o [XmlSerializer] encima del Contrato de Servicio, estoy bastante seguro de que podrías crear el tuyo, por eso los aplicas como atributos, ahora solo si el reflector se iniciara para poder inspeccionar el XmlSerializer y descubrir qué lo hace funcionar.

msdn insisten en que las clases que desean ser serializadas a través de XmlSerializer, deben estar decoradas con [XmlAttribute] o [XmlElement] (dado que darán más forma al archivo xml comprensivamente), pero funciona si sus clases están decoradas con el [DataMember] , que es compatible con DataContractSerializer, por lo que debe poder crear su propio serializador que serialice cualquier cosa con una etiqueta [DataMember], al igual que el XmlSerializer