2014-05-14 44 views
3

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

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

Order order = (Order)msg.Body; 

正文包含一些XML,但它具有类型对象。那么该对象是否会在演员阵线上使用XmlSerializer进行序列化,或者已经发生了?

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

+7

反序列化已经发生。 .NET知道'Order'对象在运行时是什么类型的,但编译器不会在你投射它之前。 –

回答

2

System.Messaging.Message.Body属性,你可以看到它的类型Object

这意味着MSMQ的消息传递框架负责为您进行序列化/反序列化。

文档状态通过Body属性传递任何对象必须是可序列:

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

当您投射到您的对象类型时,肯定没有序列化进行。

1

我想知道当通过MS消息队列收到一条消息,messagebody被转换为实际的对象

这取决于什么的msg.Body真的类型是什么情况。

如果msg.Body是一个XML字符串,则在运行时投射到Order将失败。

如果msg.Body是一个Order对象,它以XML形式传输并已被反序列化,那么您的投射将会成功。

当将对象转换为实际类型时总是发生序列化还是没有生成额外的代码?

有没有“魔法”当你施放该反序列化的XML字符串 - 无论它是一个Order或者它不是。如果它是一个XML字符串,它必须将明确地反序列化为一个不同的类型。

0

除非Message Queue多年来发生了一些变化,否则不能简单地将其转换为类型,因为没有任何功能可以将XML转换为您所需的类型。如果有一些我不知道的新魔法,这个对象将会在引擎盖下被序列化,并且管道被添加到MSMQ或.NET(或C#)的抽象中。您现在可以通过.NET位进行调试,如果您真的感兴趣,可以添加Microsoft存储库。

通常,序列化不是自动的。只有在有合适的演员阵容时,才能从普通类型转换为特定类型。否则演员失败。WCF在其中有一些魔力,但它主要在生成的代理中,在内部有一点(如果你愿意,可以使用管道而不是魔术)。

此外,一般来说,依靠魔法是不好的做法。在大多数情况下,当您从队列中拉出并使用它来重新生成对象时,应明确声明序列化程序。我允许WCF的一些宽恕。请注意,这是一个更一般的陈述,因为依靠违约行为,尤其是没有记录时,可能导致未来的灾难。

0

铸造发生在班级本身。这不是确切的代码,但是这是在执行投射时发生的情况。假设Body是一个对象类型:

public static implicit operator Body(Order d) 
    { 
     return new Order(d); 
    } 
相关问题