将对象转换为实际类

3
我想知道当通过MS消息队列接收到一条消息并将消息体转换为实际对象时会发生什么。
System.Messaging.Message msg = queue.Receive();

Order order = (Order)msg.Body;

这个body包含一些XML,但它的类型是对象。那么当进行转换操作时,这个对象是否会被XmlSerializer序列化,或者它已经发生了?

更一般地说,当将对象强制转换为实际类型时,序列化是否总是发生,还是没有额外的代码生成?


7
反序列化已经发生。在运行时,.NET知道Order对象的类型,但在你进行强制转换之前编译器并不知道。 - Keith Payne
4个回答

2

观察System.Messaging.Message.Body属性,您会发现它的类型是Object

这意味着MSMQ的消息框架会为您处理序列化/反序列化。

文档说明传递给Body属性的任何对象都必须是可序列化的:

Body属性可以是任何可序列化的对象,如文本字符串、结构体对象、类实例或嵌入式对象。

因此,在将其转换为对象类型时不会进行序列化。


1
我想知道当通过MS消息队列接收到消息并将 messagebody 强制转换为实际对象时会发生什么。
这取决于 msg.Body 的类型是什么。
如果 msg.Body 是XML字符串,则在运行时将无法将其转换为 Order
如果 msg.Body 是作为XML传输并已反序列化的 Order 对象,则您的转换将成功。
是否始终在将对象强制转换为实际类型时进行序列化,或者没有生成额外的代码?
在转换时没有“魔法”可用于反序列化XML字符串 - 它要么是 Order ,要么不是。 如果它是XML字符串,则必须显式将其反序列化为不同类型。

0

类型转换发生在类本身。这不是确切的代码,但这就是进行类型转换时发生的情况。假设Body是一个对象类型:

    public static implicit operator Body( Order d )
    {
        return new Order(d);
    }

0

除非消息队列在这些年里发生了变化,否则您不能简单地将其转换为类型,因为没有魔法可以将XML转换为所需的类型。如果有一些我不知道的新魔法,那么对象将在幕后进行序列化,并添加到MSMQ或.NET(或C#)的抽象层中以执行此操作。如果您真的感兴趣,现在可以通过添加Microsoft存储库来调试.NET位。

通常情况下,序列化不是自动完成的。只有在存在适当的转换时,您才能从一般类型转换为特定类型。否则,转换将失败。WCF中有一些魔法,但它主要在生成的代理中,内部有一点(如果您愿意,可以使用管道代替魔法这个词)。

另外,通常依赖于魔法是一个不好的做法。在大多数情况下,当您从队列中拉取时,应明确声明序列化程序,然后使用它重新生成对象。我对WCF允许一些宽限。请注意,这是一个更普遍的说法,因为依赖默认行为,特别是在未记录文档时,可能会导致未来的灾难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接