Серийный номер шины обслуживания Azure
Мы начали расследование использования служебной шины Windows Azure в качестве замены для наших текущих очередей, когда мы продвигаемся к ориентированной на обслуживание архитектуре.
Большая часть документации понятна; однако я с трудом определяю, какой тип сериализации использует BrokeredMessage
, если он снабжен телом.
Например, скажем, я создаю экземпляр объекта BrokeredMessage
, как показано ниже:
ICommand sendMessageCommand = new SendMessageCommand
{
Title = "A new message title",
Body = "A new message body"
};
BrokeredMessage brokeredMessage = new BrokeredMessage(sendMessageCommand);
queueClient.Send(brokeredMessage);
SendMessageCommand
- это простой DTO, помеченный атрибутом [Serializable]
; в наших старых очередях это было бинарным сериализованным, чтобы оно могло храниться быстрее и иметь метаданные. Это важно для нас, поскольку мы используем очереди для отправки команд с использованием шаблона описанного здесь, при этом получающая роль рабочего десериализует команду со смесью дженериков и динамической типизации.
Однако согласно статье ЭТО тело, переданное конструктору BrokeredMessage
, является "двоичным XML-сериализованным". Мое предположение заключается в том, что это стандартная сериализация XML, а затем передается через двоичный форматтер, верно ли это?
Далее; означает ли это, что если бы я использовал функциональность тела сообщения BrokeredMessage
по умолчанию; Я должен был бы обеспечить, чтобы все объекты были XML Serializable, включая все проблемы, которые представляют? (Потеря частных полей, метаданных для десериализации с использованием дженериков, атрибутов сериализации xml)
Наконец; если это так; есть ли простой способ обойти это? Я рассматривал возможность создания собственной бинарной сериализации, а затем сохранил byte[]
в свойстве BrokeredMessage
.
Ответы
Ответ 1
В соответствии с документация:
Приложение может установить тело сообщения, передав любой сериализуемый объект для конструктора BrokeredMessage и соответствующий DataContractSerializer затем будет использоваться для сериализации объект. В качестве альтернативы может быть предоставлен System.IO.Stream.
Используемый конструктор эта документация:
Инициализирует новый экземпляр класса BrokeredMessage из заданного объекта с помощью DataContractSerializer с двоичным XmlDictionaryWriter.
Это хорошо соответствует сообщениям, определенным как DataContracts, как описано в этой статье.
В качестве альтернативы вы можете использовать суррогаты, как описано в этом ответе.
Вы также можете предоставить собственный сериализатор или поток.
Альтернативой может быть ваша собственная сериализация и использование байтового массива или строки в качестве сериализуемого объекта, предоставленного конструктору (в отличие от свойства сообщения). Это адекватный подход к взаимодействию, поскольку вы можете использовать форматы сериализации, такие как JSON или protobuf. Microsoft "Лучшие практики для производительности в приложениях Windows Azure" рекомендует использовать пользовательскую или стороннюю сериализацию, когда это влияет на производительность.
У меня были хорошие результаты с использованием сериализации JSON и динамических объектов.