c# serialization azure azureservicebus

c# - Tipo de serialización de bus de servicio de Azure



serialization azureservicebus (1)

Según la documentación :

Una aplicación puede configurar el cuerpo del mensaje pasando cualquier objeto serializable al constructor de BrokeredMessage, y luego se utilizará el DataContractSerializer apropiado para serializar el objeto. Alternativamente, se puede proporcionar un System.IO.Stream.

El constructor que estás usando tiene esta documentación :

Inicializa una nueva instancia de la clase BrokeredMessage desde un objeto dado usando DataContractSerializer con un XmlDictionaryWriter binario.

Esto encaja bien con los mensajes definidos como DataContracts, como se explica en este artículo .

Alternativamente, puede usar sustitutos como se describe en esta respuesta .

También puede proporcionar su propio serializador o una secuencia .

Una alternativa sería hacer su propia serialización y usar una matriz de bytes o una cadena como el objeto serializable proporcionado al constructor (a diferencia de en una propiedad de mensaje). Este es un enfoque adecuado para la interoperabilidad, ya que puede usar formatos de serialización como JSON o protobuf . Las Mejores prácticas para el rendimiento de Microsoft en aplicaciones de Windows Azure recomiendan el uso de una serialización personalizada o de terceros cuando afecta el rendimiento.

He tenido buenos resultados con la serialización JSON y los objetos dinámicos.

Comenzamos a investigar el uso del Bus de servicio de Windows Azure como reemplazo de nuestras colas actuales a medida que avanzamos hacia una arquitectura orientada a servicios.

La mayor parte de la documentación es clara; sin embargo, me resulta difícil determinar qué tipo de serialización utiliza el BrokeredMessage cuando se le proporciona un cuerpo.

Por ejemplo, digamos que crea una instancia de un objeto BrokeredMessage como se muestra a continuación:

ICommand sendMessageCommand = new SendMessageCommand { Title = "A new message title", Body = "A new message body" }; BrokeredMessage brokeredMessage = new BrokeredMessage(sendMessageCommand); queueClient.Send(brokeredMessage);

SendMessageCommand es un DTO simple marcado con el atributo [Serializable] ; en nuestras antiguas colas, este se serializaba en binario para que pudiera almacenarse más rápido y conservar sus metadatos. Esto es importante para nosotros ya que usamos las colas para enviar comandos usando el patrón descrito aquí con el rol de trabajador receptor que deserializa el comando con una mezcla de genéricos y tipografía dinámica.

Sin embargo, según THIS artículo, el cuerpo pasado al constructor de BrokeredMessage es "Binary XML Serialized". Mi suposición es que esta es una serialización XML estándar que luego pasa a través de un formateador binario, ¿es correcto?

Además de esto; ¿Significa eso que si tuviera que usar la funcionalidad predeterminada del cuerpo del mensaje de BrokeredMessage ; Tendría que asegurarme de que todos los objetos sean serializables en XML, incluidos todos los problemas que se presentan? (Pérdida de campos privados, no hay metadatos para deserializar usando genéricos, atributos de serialización xml)

Finalmente; si este es el caso; ¿Hay una manera simple de evitar esto? Estaba considerando realizar nuestra propia serialización binaria y luego almacenar el byte[] en una propiedad en el BrokeredMessage .