原文:WCF随笔3----消息编码器

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

最新文章

  1. 如何解决流程开发中SheetRadioButtonList页面取值问题
  2. 安利eclipse插件之log4E
  3. TCP定时器
  4. 高仿QQ的即时通讯应用带服务端软件安装
  5. 学习Ember遇到的一些问题
  6. [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
  7. Windows10笔记本双显卡导致的启动黑屏解决办法之一
  8. ASP.NET - 锚点跳转,用于回到顶部
  9. 重写ViewPager实施单一交有关切换到这个问题,并没有缓存
  10. One day one cf,Keep Wa away from me.
  11. CSDN2013年度博客之星评选
  12. javascript加RoR实现JSONP
  13. 第十二节,OpenCV学习(一)图像的读取、显示、保存
  14. spring boot 2.0 整合 elasticsearch6.5.3,spring boot 2.0 整合 elasticsearch NoNodeAvailableException
  15. const int *p;int *const p;区别及用法
  16. [2] LabelImg图片标注 与 YOLOv3 网络训练 (待补充)
  17. Nagios故障 CHECK_NRPE: Socket timeout after 10 seconds.
  18. 关于Docker目录挂载的总结(转)
  19. [转] 阿里研究员谷朴:API 设计最佳实践的思考
  20. java中数据字典的使用:

热门文章

  1. JavaScript 高级程序设计(第3版)笔记——chapter5:引用类型
  2. 循环调用修正sic86 2改后的(除了第一年有点诡异,其他年份可以正常修复)
  3. 【转】CentOS 6.5 生产环境优化指南
  4. C语言循环剖析(转载)
  5. ZOJ 3607 Lazier Salesgirl 贪心
  6. 四级流水线的8bit加法器
  7. Week6(10月14日)
  8. 关于初始化C++类成员
  9. C++ pair 使用方法
  10. Sort List 分类: leetcode 算法 2015-07-10 15:35 1人阅读 评论(0) 收藏