随着我们转向面向服务的体系结构,我们已开始研究使用 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]
属性;在我们的旧队列中,这是二进制序列化的,因此可以更快地存储并保留其元数据。这对我们来说很重要,因为我们使用队列来发送命令此处概述的模式 https://cuttingedge.it/blogs/steven/pivot/entry.php?id=91接收工作者角色使用泛型和动态类型的混合来反序列化命令。
然而根据THIS https://msdn.microsoft.com/en-us/library/windowsazure/hh694235.aspx文章正文传递给了构造函数BrokeredMessage
是“二进制 XML 序列化”。我的假设是,这是标准 XML 序列化,然后通过二进制格式化程序传递,对吗?
更进一步;这是否意味着如果我使用默认值BrokeredMessage
消息体功能;我必须确保所有对象都是 XML 可序列化的,包括出现的所有问题? (私有字段丢失,没有用于使用泛型反序列化的元数据,xml序列化属性)
最后;如果是这种情况;有没有一个简单的方法可以解决这个问题?我正在考虑进行我们自己的二进制序列化,然后存储byte[]
在某处房产中BrokeredMessage
.
根据文档 http://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-topics/:
应用程序可以通过传递任何内容来设置消息正文
可序列化对象传递给 BrokeredMessage 的构造函数,并且
然后将使用适当的 DataContractSerializer 来序列化
目的。或者,可以提供 System.IO.Stream。
您正在使用的构造函数有本文档 http://msdn.microsoft.com/en-us/library/windowsazure/hh322644.aspx:
从给定的 BrokeredMessage 类初始化一个新实例
对象通过使用 DataContractSerializer 和二进制
XmlDictionaryWriter。
这非常适合定义为 DataContracts 的消息,如所解释的在本文中 http://www.cloudcasts.net/devguide/Default.aspx?id=12029.
或者,您可以使用代理,如中所述这个答案 https://stackoverflow.com/a/15452274/376366.
您还可以提供你自己的序列化器 http://msdn.microsoft.com/en-us/library/windowsazure/hh330723.aspx or a stream http://msdn.microsoft.com/en-us/library/windowsazure/hh330764.aspx.
另一种方法是进行自己的序列化,并使用字节数组或字符串作为提供给构造函数的可序列化对象(而不是在消息属性中)。这是实现互操作性的充分方法,因为您可以使用序列化格式,例如 JSON 或protobuf http://udooz.net/blog/2012/08/azure-servicebus-message-payload-protobuf-serialization/。微软自己的Windows Azure 应用程序性能最佳实践 http://www.windowsazure.com/en-us/develop/net/best-practices/performance/建议在影响性能时使用自定义或第三方序列化。
我使用 JSON 序列化和动态对象获得了良好的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)