今天在使用.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);
不知何解。