将对象强制转换为实际的类
本文关键字:转换 对象 | 更新日期: 2023-09-27 18:03:14
我想知道当消息通过MS消息队列接收并且messagebody被强制转换为实际对象时会发生什么。
System.Messaging.Message msg = queue.Receive();
Order order = (Order)msg.Body;
正文包含一些XML,但它具有object类型。那么,对象是在强制转换行被XmlSerializer序列化,还是已经被序列化了?
或者更一般地说,序列化是否总是在将对象转换为实际类型时发生,或者没有生成额外的代码?
查看System.Messaging.Message.Body
属性,您可以看到它的类型为Object
。
这意味着MSMQ的消息传递框架为您处理序列化/反序列化。
文档说明任何通过Body
属性传递的对象必须是可序列化的:
Body属性可以是任何可序列化的对象,如文本字符串、结构对象、类实例或嵌入对象。
当你转换到你的对象类型时,肯定没有进行序列化。
我想知道当通过MS消息队列接收消息并且
messagebody
被强制转换为实际对象时会发生什么
这取决于msg.Body
的真正类型。
如果msg.Body
是一个XML字符串,那么转换到Order
将在运行时失败。
如果msg.Body
是作为XML传输并且已经反序列化的Order
对象,那么您的强制转换将成功。
在将对象转换为实际类型时是否总是发生序列化,或者是否没有生成额外的代码?
当您强制转换时,没有"魔法"可以反序列化XML字符串-无论它是Order
还是不是。如果它是一个XML字符串,它必须被显式地反序列化成不同的类型。
除非多年来Message Queue中发生了一些变化,否则不能简单地将XML强制转换为类型,因为没有魔法可以将XML转换为您想要的类型。如果有一些我不知道的新魔法,对象将在底层被序列化,并且管道被添加到MSMQ或。net(或c#)的抽象中来完成它。如果您真的感兴趣,现在可以通过添加Microsoft存储库来调试。net位。
一般来说,序列化不是自动的。只有当有适当的类型转换可用时,才能从一般类型转换为特定类型。否则就会失败。WCF有一些魔力,但它主要是在生成的代理中,还有一点在内部(如果您喜欢,可以使用管道而不是魔术这个词)。
而且,一般来说,依赖魔术是一种不好的做法。在大多数情况下,当您从队列中取出时,您应该显式地声明序列化器,然后使用它来重新生成对象。我允许WCF得到一些原谅。请注意,这是一个更一般的说法,因为依赖默认行为,特别是当它没有文档记录时,可能会导致未来的灾难。
强制类型转换发生在类本身。这不是确切的代码,但这是在进行类型转换时发生的情况。假设Body是一个对象类型:
public static implicit operator Body( Order d )
{
return new Order(d);
}