17

随着我们转向面向服务的体系结构,我们已经开始研究使用 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是用[Serializable]属性标记的简单 DTO;在我们的旧队列中,这是二进制序列化的,因此可以更快地存储它并保留它的元数据。这对我们很重要,因为我们使用队列使用此处概述的模式发送命令,接收 Worker Role 使用泛型和动态类型的混合反序列化命令。

然而,根据这篇文章,传递给构造函数的主体BrokeredMessage是“Binary XML Serialized”。我的假设是这是标准的 XML 序列化,然后通过二进制格式化程序,对吗?

除此之外; 这是否意味着如果我要使用默认的BrokeredMessage消息正文功能;我必须确保所有对象都是 XML 可序列化的,包括出现的所有问题?(私有字段丢失,没有使用泛型反序列化的元数据,xml序列化属性)

最后; 如果是这种情况;有没有简单的方法解决这个问题?我正在考虑进行我们自己的二进制序列化,然后将其存储byte[]BrokeredMessage.

4

1 回答 1

22

根据文档

应用程序可以通过将任何可序列化的对象传递给 BrokeredMessage 的构造函数来设置消息的主体,然后使用适当的 DataContractSerializer 来序列化该对象。或者,可以提供 System.IO.Stream。

您正在使用的构造函数具有以下文档

通过使用带有二进制 XmlDictionaryWriter 的 DataContractSerializer 从给定对象初始化 BrokeredMessage 类的新实例。

这非常适合定义为 DataContracts 的消息,如本文所述

或者,您可以使用此答案中描述的代理。

您还可以提供自己的序列化程序或

另一种方法是进行自己的序列化并使用字节数组或字符串作为提供给构造函数的可序列化对象(而不是在消息属性中)。这是一种充分的互操作性方法,因为您可以使用 JSON 或protobuf等序列化格式。Microsoft 自己的 Windows Azure 应用程序性能最佳实践建议在影响性能时使用自定义或第三方序列化。

我使用 JSON 序列化和动态对象取得了不错的效果。

于 2013-07-10T17:47:39.733 回答