博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WCF随笔3----消息编码器
阅读量:5291 次
发布时间:2019-06-14

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

原文:

  我们都知道,message是wcf通信框架进行通信的最基本的单位,但是wcf开发人员其实根本不需要直接与message打交道,一样能够写好wcf相关的程序.这是因为整个框架都为我们做好了一切,当客户端创建了连接服务端的通道之后,通过客户端的代理想服务端发送消息的时候,wcf基础结构就开始忙着在背后创建,发送,接受处理message对象的工作.发送消息的时候其实是要经历过几次转换的,从发送者角度来看包括:序列化和编码,序列化是把message对象转换为xml数据,编码是将xml数据转换为特定的数据格式,比如常见的二进制格式.从服务端的角度看正好相反所以,从今天晚上开始进入message对象的学习.

  在消息的序列化和编码的过程有两个重要的类型 XmlDictionaryReader,XmlDictionaryWriter,一个是读,另一个是写.先来说下XmlDictionaryWriter,它是用来序列化和编码message类型的,使用时,首先要创建XmlDictionaryWriter对象,我们在创建对象的时候一般是调用XmlDictionaryWriter中的静态函数,CreateTextWriter(),CreateBinaryWriter(),CreateDictionaryWriter(),CreateMtomWriter(),这个四个方法都会返回一个XmlDictionaryWriter对象,每个方法都有重载,至于每个方法参数是什么意思,呵呵,额也不是都知道,具体用的时候还是要去查msdn的..所以大家想进一步了解的话,还是自己查下吧...*_*,前面两个静态函数应该说使我们比较常用的.第一个的作用是为了产生基于文本编码的xml.第二个的作用是了产生基于二进制编码的xml.主要介绍这两个.刚刚说了,XmlDictionaryWriter是负责编码,将message编码成指定格式的xml数据,那么经过编码之后的数据就可以发送到服务端了,这个时候就要用到XmlDictionaryReader这个对象来对经过编码的数据进行解析了.它的使用基本上和XmlDictionaryWriter对象的用法一样,也是通过静态函数返回对象,针对四种不同的编码模式,它也有四种不同解析器.CreateTextReader(),CreateBinaryReader(),CreateDictionaryReader(),CreateMtomReader(),只要根据客户端的编码规则,选择相应的解码器就可以了.先上代码:

class Program    {        static void Main(string[] args)        {            Console.WriteLine("文本编码器:");            TextWriter();            Console.WriteLine("*******************我是美丽的分割线******************");            Console.WriteLine("二进制编码器:");            BinaryWriter();            Console.ReadLine();        }        //文本编码        public static MemoryStream TextWriter()        {            MemoryStream _stream = new MemoryStream();            //创建用于产生基于文本编码的xml的编码器            using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(_stream, Encoding.UTF8, false))            {                writer.WriteStartDocument();//说明开始编写版本为"1.0"并具有独立属性的 XML 声明。                writer.WriteElementString("LocalName", "ns", "value");                writer.WriteEndDocument();                writer.Flush();            }            Console.WriteLine("XmlDictionaryWriter has wrote {0} bytes", _stream.Position);            Byte[] _b = _stream.ToArray();            _stream.Position = 0;            Console.WriteLine("二进制内容:{0}", BitConverter.ToString(_b));            //Console.WriteLine("转换成字符串:\n{0}", new StreamReader(_stream).ReadToEnd());            XmlDictionaryReader xmlreader = XmlDictionaryReader.CreateTextReader(_stream, new XmlDictionaryReaderQuotas());            xmlreader.MoveToContent();            Console.WriteLine("转换成字符串:\n{0}", xmlreader.ReadOuterXml());                        return _stream;        }        //二进制编码        public static MemoryStream BinaryWriter()        {            MemoryStream _stream = new MemoryStream();            //创建用于产生二进制编码的xml的编码器            using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(_stream,null, null,false))            {                writer.WriteStartDocument();                writer.WriteElementString("LocalName", "ns", "value");                writer.WriteEndDocument();                writer.Flush();            }            Console.WriteLine("XmlDictionaryWriter has wrote {0} bytes", _stream.Position);            Byte[] _b = _stream.ToArray();            _stream.Position = 0;            Console.WriteLine("二进制内容:{0}", BitConverter.ToString(_b));            //创建XmlDictionaryReader对象,将刚刚用二进制编码器进行编码的之后的数据读成字符串            XmlDictionaryReader xmlreader = XmlDictionaryReader.CreateBinaryReader(_b, new XmlDictionaryReaderQuotas());            xmlreader.Read();            Console.WriteLine("转换成字符串:\n{0}",xmlreader.ReadOuterXml());                       return _stream;        }    }

运行结果:

在上面两种编码的模式中,我都使用了

XmlDictionaryReader这个对象,其实基于文本编码的xml数据,是可以直接用流读出来的,上面的代码我已经注释掉了,感兴趣的朋友可以试下,一样可以将数据都出来. 从上面的运行结果中我们可以看到二进制编码的模式比文本模式的效率要高,同样的数据,一个是22字节,另一个是77字节...嘿嘿,从性能上来看是可以考虑采用二进制编码器了 以上就是全部内容,写得比较粗糙~见谅哈...还是那句话,只是为了mark自己学习的点点滴滴``
posted on
2015-07-10 04:27 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/4634699.html

你可能感兴趣的文章
51job_selenium测试
查看>>
代理商数据库_文本过滤处理
查看>>
Bootstrapping算法
查看>>
性能测试(LoadRunner)基础知识
查看>>
数据结构(七)排序---归并排序
查看>>
java多线程知识点汇总(二)多线程实例解析
查看>>
mysql的用户管理(二)
查看>>
【科技】高斯消元简析
查看>>
没有欲望是一种什么样的感觉
查看>>
pzoj Problem 2127 养鸡场
查看>>
有趣的JavaScript隐式类型转换
查看>>
wireshark 无法抓取本地数据包
查看>>
sql 知道年龄 数据库里面只有身份证 查询条件为这个年龄的所有数据
查看>>
android 高德地图出现【定位失败key鉴权失败】
查看>>
如何使用mybatis插入数据之前就具生成id值
查看>>
算法笔记--基础数学知识
查看>>
Extjs Dom
查看>>
初始化linux部署tomcat
查看>>
Predictive Analytics for Business
查看>>
Python中常用的模块(OS模块)
查看>>