天天看點

MSMQ與Hashtable

   今天在使用.NET操作消息隊列時,碰到一個小問題,如果采用XmlMessageFormatter序列化消息體,則消息體中不能包含Hashtable等字段,否則将無法完成序列化和反序列化(即使消息體對象加上了Serializable特性也不行)。

   經過研究發現,XmlMessageFormatter不會采用我們經常用于.NET Remoting序列化的二進制或Soap格式,而是使用Xml格式,是以Serializable标簽對于XmlMessageFormatter不起作用。XmlMessageFormatter所支援的消息體對象中隻能包含一些非常簡單的基礎類型字段。

   為了讓像Hashtable這樣的類型能嵌入到消息體中,我們隻有采用BinaryMessageFormatter,BinaryMessageFormatter采用的與.NET Remoting一樣的運作庫串行化機制,是以Serializable特性标簽會被BinaryMessageFormatter識别,而且,我們必須為作為消息體的對象加上Serializable特性才能使用BinaryMessageFormatter。

   如果我們像這樣使用BinaryMessageFormatter,仍然會抛出無法序列化的異常:

        public void SendItem(MQItem item)

        {

            System.Messaging.Message msg = new System.Messaging.Message();

            msg.Body = item;

            msg.Label = "MQItem";

            this.msgQueueForSend.Send(msg); //this.msgQueueForSend.Formatter = new BinaryMessageFormatter();

        }

   但是換成下面就正常了:

        public void SendItem(MQItem item)

            System.Messaging.Message msg = new System.Messaging.Message(item ,new BinaryMessageFormatter());            

            this.msgQueueForSend.Send(msg);

   不知何解。