原文: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自己学习的点点滴滴``

WCF随笔3----消息编码器的更多相关文章

  1. 【.net 深呼吸】记录WCF的通信消息

    前面老周给大伙伴们介绍了把跟踪信息写入日志文件的方法,今天咱们换个类似的话题来扯一下,对了,咱们就说说怎么把WCF的往来消息log下来吧. 尽管在现实生活中,我们不主张偷窥他人信息,不过,偷窥程序信息 ...

  2. [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

    老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...

  3. wcf中的消息模式

    1请求响应模式 a.wcf中的消息模式默认是请求响应模式 b.返回值是void默认也是请求响应模式,可返回服务端的错误信息 c.客户端在请求后,当前线程停止真到接受收服务器的响应 [Opereatio ...

  4. 跟我一起学WCF(1)——MSMQ消息队列

    一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能 ...

  5. 在WCF中使用消息队列

    在一些大型的解决方案中,假设我们的服务没有办法一直在线,或者因为这样那样的原因宕机了,有没有什么办法让客户端的影响最小化呢?答案是可以通过消息队列的方式,哪怕服务是没有在线的,客户端依然可以继续操作. ...

  6. WCF基础之消息协定

    通常定义消息的架构,使用数据协定就够了,但是有时必须将类型精确映射到soap消息,方法两种:1.插入自定义soap标头:2.另一种是定义消息的头和正文的安全属性.消息协定通过MessageContra ...

  7. WCF自动添加消息头

    客户端自定义消息查看器实现IClientMessageInspector接口在消息发送之前添加消息头 class ClientMessageInspector : System.ServiceMode ...

  8. [WCF REST] Web消息主体风格(Message Body Style)

    对于Web HTTP编程模型来说,服务契约中作为操作的方法无须应用OperationContractAttribute特性,只需要根据需要应用WebGetAttribute与WebInvokeAttr ...

  9. WCF之MSMQ消息队列

    一.MSMQ简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具. MSMQ与XML Web Services和.Net ...

随机推荐

  1. C# 基础知识 (三).主子对话框数值传递

    在C# winform编程中,我们经常会遇到不同窗口间需要传递数值的问题.比如数据库的应用,主窗口填写内容num1,点击按钮,在弹出的子窗口显示对应num1值;或者在子窗口填写新注册用户名信息,在主窗 ...

  2. hdu 4679 (树形DP)

    题意:给一棵树,边的权值都是1,摧毁每条边是有代价的,选择摧毁一条边,把一棵树分成两部分,求出两部分中距离最大的两点的距离,求出距离*代价最小的边,多条的话输出序号最小的. 刚开始理解错题意了,wro ...

  3. Eclipse中设置tomcat的启动内存

    现象:眼下每次使用Eclipse启动Tomcat 的时候常常出现OutOfMemoryError thrown from the UncaughtExceptionHandler in thread ...

  4. 浙江工商大学15年校赛C题 我删我删,删删删 【简单模拟】

    Description: 有一个大整数.不超过1000位.假设有N位.我想删掉其中的任意S个数字.使得删除S位后,剩下位组成的数是最小的. Input: 有多组数据数据,每组数据为两行.第一行是一个大 ...

  5. 【集训笔记】【大数模板】特殊的数 【Catalan数】【HDOJ1133【HDOJ1134【HDOJ1130

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3324 http://blog.csdn.net/xymscau/artic ...

  6. media_root以及static_root配置

    # At the top of settings/base.pyfrom os.path import join, abspath, dirnamehere = lambda *x: join(abs ...

  7. Week12(11月25日)

    Part I:提问 =========================== 1.如何删除一条记录? Part II:理论学习 =========================== 到目前为止,我们考 ...

  8. fancyBox简单入门

    1. 下载 fancyBox,解压后根据需要将文件复制到网页文件夹中(建议不要更改目录结构),并在网页源码中引入相应的 css 样式和 js 文件(如果更改了目录结构,引入的时候请调整相应代码,对应它 ...

  9. eclipse 找不到application选项

    处理如下:Window-Preferences-Run/Debug-Perspectives 中的 And Build修改为如下

  10. Dockerfile指令总结

    指令的一般格式为INSTRUCTION arguments,指令包含FROM.MAINTAINER.RUN等. FROM 格式为FROM <image>或FROM <image> ...