将对象强制转换为实际的类

本文关键字:转换 对象 | 更新日期: 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);
    }