将对象转换为实际的类

时间:2014-05-14 12:59:55

标签: c# .net

我想知道当通过MS消息队列接收消息并且消息体被强制转换为实际对象时会发生什么。

System.Messaging.Message msg = queue.Receive();

Order order = (Order)msg.Body;

正文包含一些XML,但它有类型对象。那么对象是否在演员阵容中使用XmlSerializer进行序列化或已经发生过?

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

4 个答案:

答案 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);
    }