2014-05-14 45 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); 
    } 
相關問題