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());            
            msg.Label 
= "MQItem";
            
this.msgQueueForSend.Send(msg);
        }

   不知何解。


posted @   zhuweisky  阅读(2854)  评论(3编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示