博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MSMQ实现自定义序列化存储
阅读量:5832 次
发布时间:2019-06-18

本文共 5578 字,大约阅读时间需要 18 分钟。

在使用MSMQ的时候一般只会使用默认的XML序列化来对消息进行存储,但XML存储的缺点是序列化体积相对比较大和效率上有点低.其实.net提供非常简单的方式让我们实现不同序列化方式来存储MSMQ信息,如json,protobuf等.为了能够让开发人员实现自定义序列化的消息存储,.NET提供了IMessageFormatter这样一个接口,只需要简单地实现这个接口就可以对MSMQ的消息进行处理.以下讲解如何实现json和protobuf的messageformater.

IMessageFormatter

// 摘要:    //     从“消息队列”消息体序列化或反序列化对象。    [TypeConverter(typeof(MessageFormatterConverter))]    public interface IMessageFormatter : ICloneable    {        // 摘要:        //     在类中实现时,确定格式化程序是否可以反序列化消息的内容。        //        // 参数:        //   message:        //     要检查的 System.Messaging.Message。        //        // 返回结果:        //     如果格式化程序可以反序列化消息,则为 true;否则为 false。        bool CanRead(Message message);        //        // 摘要:        //     在类中实现时,读取给定消息中的内容并创建包含该消息中的数据的对象。        //        // 参数:        //   message:        //     The System.Messaging.Message to deserialize.        //        // 返回结果:        //     反序列化的消息。        object Read(Message message);        //        // 摘要:        //     在类中实现时,将对象序列化到消息体中。        //        // 参数:        //   message:        //     System.Messaging.Message,它将包含序列化的对象。        //        //   obj:        //     要序列化到消息中的对象。        void Write(Message message, object obj);    }

接口非常简单,主要规范了MSMQ写入和读取的规则.

Json Formater

public class JsonFormater
: IMessageFormatter { public bool CanRead(Message message) { return message.BodyStream != null && message.BodyStream.Length > 0; } [ThreadStatic] private static byte[] mBuffer; public object Read(Message message) { if(mBuffer== null) mBuffer = new byte[4096]; int count =(int)message.BodyStream.Length; message.BodyStream.Read(mBuffer, 0, count); return Newtonsoft.Json.JsonConvert.DeserializeObject(Encoding.UTF8.GetString(mBuffer, 0, count), typeof(T)); } [System.ThreadStatic] private static System.IO.MemoryStream mStream; public void Write(Message message, object obj) { if (mStream == null) mStream = new System.IO.MemoryStream(4096); mStream.Position = 0; mStream.SetLength(4095); string value = Newtonsoft.Json.JsonConvert.SerializeObject(obj); int count = Encoding.UTF8.GetBytes(value, 0, value.Length, mStream.GetBuffer(), 0); mStream.SetLength(count); message.BodyStream = mStream; } public object Clone() { return this; } }

Protobuf Formater

public class ProtobufFormater
: IMessageFormatter { public bool CanRead(Message message) { return message.BodyStream != null && message.BodyStream.Length > 0; } public object Read(Message message) { return ProtoBuf.Meta.RuntimeTypeModel.Default.Deserialize(message.BodyStream, null, typeof(T)); } [System.ThreadStatic] private static System.IO.MemoryStream mStream ; public void Write(Message message, object obj) { if (mStream == null) mStream = new System.IO.MemoryStream(4096); mStream.Position = 0; mStream.SetLength(0); ProtoBuf.Meta.RuntimeTypeModel.Default.Serialize(mStream, obj); message.BodyStream = mStream; } public object Clone() { return this; } }

使用Formater

使有自定义Formater比较简单,只需要指定MessageQueue的Formatter属性即可.

MessageQueue queue = new MessageQueue(@".\private$\Test");            queue.Formatter = new JsonFormater
();

简单的测性能测试

针对json,protobuf这两种自定义序列化和默认的XML序列化性能上有多大差异,各自进行100000条写入和读取的耗时情况.

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();            sw.Reset();            sw.Start();            for (int i = 0; i < 100000; i++)            {                queue.Send(user);            }            sw.Stop();            Console.WriteLine("MSMQ send xml formater:" + sw.Elapsed.TotalMilliseconds + "ms");            sw.Reset();            sw.Start();            for (int i = 0; i < 100000; i++)            {                User result = (User)queue.Receive().Body;            }            sw.Stop();            Console.WriteLine("MSMQ receive xml formater:" + sw.Elapsed.TotalMilliseconds + "ms");            queue.Formatter = new JsonFormater
(); sw.Reset(); sw.Start(); for (int i = 0; i < 100000; i++) { queue.Send(user); } sw.Stop(); Console.WriteLine("MSMQ send Json formater:" + sw.Elapsed.TotalMilliseconds + "ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 100000; i++) { User result = (User)queue.Receive().Body; } sw.Stop(); Console.WriteLine("MSMQ receive json formater:" + sw.Elapsed.TotalMilliseconds + "ms"); queue.Formatter = new ProtobufFormater
(); sw.Reset(); sw.Start(); for (int i = 0; i < 100000; i++) { queue.Send(user); } sw.Stop(); Console.WriteLine("MSMQ send Protobuf formater:" + sw.Elapsed.TotalMilliseconds+"ms"); sw.Reset(); sw.Start(); for (int i = 0; i < 100000; i++) { User result = (User)queue.Receive().Body; } sw.Stop(); Console.WriteLine("MSMQ receive Protobuf formater:" + sw.Elapsed.TotalMilliseconds + "ms");

测试结果

从测试来看还是protobuf效率上占优点:)

转载地址:http://veedx.baihongyu.com/

你可能感兴趣的文章
甘肃建丝绸之路大数据平台 汇聚沿线国家信息
查看>>
江西加快智慧防汛建设 构建防汛大数据平台
查看>>
JAXenter发布2017最受欢迎的云平台调查
查看>>
VMware、Citrix何以平分秋色?
查看>>
杭州人正在用的城市大脑,有可能是人类下一个“登月计划”
查看>>
爱立信:物联网转型业务推动运营商沿价值链上行
查看>>
大数据在政府购买公共服务中的作用探析
查看>>
新疆博州2017年计划投入8000万元建分布式光伏电站 惠及23个贫困村
查看>>
测试自动化技能树
查看>>
微软颠覆Salesforce在SaaS市场的龙头地位
查看>>
Android 推送 整合小米、个推、jpush
查看>>
《DevOps实战:VMware管理员运维方法、工具及最佳实践》——2.6 小结
查看>>
《腾讯iOS测试实践》一一1.3 品质管理
查看>>
代码即犯罪现场
查看>>
X11 Server 发现 23 年历史的安全漏洞
查看>>
中国工业用机器人数量惊人,三分之二工作受威胁
查看>>
机器学习很火很潮,但你真的需要吗?
查看>>
每日一博|卷积神经网络初探
查看>>
《Storm企业级应用:实战、运维和调优》——2.2 启动模式
查看>>
Sequelize 4.0.0(final) 发布,Node.js 的 ORM
查看>>