我们都知道,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自己学习的点点滴滴``