我想知道当通过MS消息队列接收消息并且消息体被强制转换为实际对象时会发生什么。
System.Messaging.Message msg = queue.Receive();
Order order = (Order)msg.Body;
正文包含一些XML,但它有类型对象。那么对象是否在演员阵容中使用XmlSerializer进行序列化或已经发生过?
或者更一般地说,在将对象转换为实际类型时是否总是会发生序列化,或者是否没有生成额外的代码?
答案 0 :(得分:2)
查看System.Messaging.Message.Body
属性,您可以看到Object
类型的内容。
这意味着MSMQ的消息传递框架会为您处理序列化/反序列化。
文档说明通过Body
属性传递的任何对象都必须是可序列化的:
Body属性可以是任何可序列化的对象,例如文本字符串,结构对象,类实例或嵌入对象。
当你转换为你的对象类型时,肯定没有序列化。
答案 1 :(得分:1)
我想知道当通过MS消息队列收到消息并且
messagebody
被强制转换为实际对象时会发生什么
这取决于msg.Body
的类型。
如果msg.Body
是XML字符串,则转换为Order
将在运行时失败。
如果msg.Body
是一个Order
对象,它已作为XML传输并已反序列化,那么您的演员阵容将会成功。
在将对象转换为实际类型时是否总是发生序列化,或者是否没有生成额外的代码?
没有"魔法"在您投射时反序列化XML字符串 - 要么是Order
,要么不是。{1}}。如果它是XML字符串,则必须将显式反序列化为其他类型。
答案 2 :(得分:0)
除非在Message Queue中多年来发生了某些变化,否则您不能简单地转换为类型,因为将XML转换为您想要的类型是没有魔力的。如果有一些我不知道的新魔法,那么对象将在引擎盖下被序列化,并且管道被添加到MSMQ或.NET(或C#)的抽象中来执行它。如果您真的感兴趣,可以通过添加Microsoft存储库来调试.NET位。
通常,序列化不是自动的。只有在有适当的强制转换时,才能从常规类型转换为特定类型。否则施法失败。 WCF有一些神奇之处,但它主要在生成的代理中,内部有一点(如果你愿意,可以使用管道代替魔术这个词)。
此外,一般来说,依靠魔法是一种不好的做法。在大多数情况下,您应该从队列中提取时显式声明序列化程序,然后使用它来重新生成对象。我允许一些宽恕WCF。请注意,这是一个更一般的陈述,因为依赖于默认行为,特别是在没有记录的情况下,可能会导致未来的灾难。
答案 3 :(得分:0)
转换发生在类本身中。这不是确切的代码,但这是铸造时发生的事情。假设Body是一个对象类型:
public static implicit operator Body( Order d )
{
return new Order(d);
}