wcf序列化和消息编码
来源:互联网 发布:大秦帝国 纵横 知乎 编辑:程序博客网 时间:2024/06/05 12:42
http://blog.csdn.net/yl2isoft/article/details/53287525
1、wcf松耦合的实现
wcf是基于服务架构(soa)的一种实现,soa由若干既独立又相互关联的子系统构成,子系统之间通过服务调用来沟通,当子系统a调用子系统b提供的服务时,子系统a是client,子系统b是service。
wcf中,使用服务契约(service contract)来实现客户端对服务的调用。可以将服务契约理解为接口,定义了服务能够提供的操作,它决定了客户端调用服务的方式,只要服务调用方式没有发生改变,不管服务怎么实现,都不影响客户端正常使用服务。将相对稳定的服务契约和service的实现隔离开来,使客户端和服务端之间具有了松耦合的特性。
2、客户端和服务端的消息交互过程
客户端和服务端使用soap message来交换信息,客户端调用服务以及服务返回调用结果都是通过soap message来表示。客户端和服务端之间的消息交换具有不同的模式(Request/Response、 One-way、Duplex),不同的消息交换模式(mep)构成了不同的服务调用方式。
soap message使用xml格式来表示消息,客户端使用soap message调用服务时,需要将.net对象序列化成xml数据(Serialization),为了数据能够经由网络传输,需要将xml数据转换成字节流(Encoding),到了服务端需要将字节流翻译成xml数据(Deconding),再将xml数据反序列化成.net对象(Deserialization),进行服务调用。
3、wcf序列化
wcf使用DataContractSerializer(默认)、XMLSerializer和NetDataContractSerializer将.net对象序列化成xml。使用DataContractSerializer序列化.net对象,类型必须运用DataContractAttribute, 需要序列化的成员必须运用DataMemberAttribute。XMLSerializer是asmx采用的序列化器,使用XMLSerializer序列化.net对象,不需要使用DataContractAttribute和DataMemberAttribute。NetDataContractSerializer和DataContractSerializer基本类似,不做说明。
4、wcf编码
WCF提供了3种典型的编码方式:Binary、Text和MTOM(Message Transmission Optimized Mechanism)。Binrary以二进制的方式进行消息的编码,能够极大地减少编码后字节的大小,但是仅限于.NET平台之间的通信。基于纯文本的编码具有平台无关性,所以Text提供平台无关的基于文本的编码方式。MTOM编码基于WS-MTOM规范,是一种跨平台的编码方式。MTOM兼具文本编码的跨平台能力,又具有Binary编码高压缩率的优势。
wcf使用XmlDictionaryWriter将XML数据进行编码写入到流中,而XmlDictionaryReader将数据从流中读出并进行解码,生成相应的XML。XmlDictionaryWriter是一个继承自System.Xml.XmlWriter的抽象类,WCF中定义了一系列具体的XmlDictionaryWriter,它们直接或者间接地继承自XmlDictionaryWriter,为编码和解码提供了不同的实现。典型的XmlDictionaryWriter包括以下3个:XmlUTF8TextWriter提供基于文本的编码和解码实现;XmlBinaryWriter提供基于二进制的编码和解码实现;XmlMtomWriter提供基于MTOM的编码和解码实现。使用XmlDictionaryWriter中定义的工厂方法CreateTextWriter、CreateBinaryWriter和CreateMtomWriter来创建XmlUTF8TextWriter、XmlBinaryWriter和XmlMtomWriter这些对象。
5、结构图
- wcf序列化和消息编码
- wcf序列化和消息编码
- [原创] WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
- 《WCF技术内幕》翻译26:第2部分_第5章_消息:Buffered vs Streamed、序列化和反序列化消息
- 《WCF技术内幕》翻译26:第2部分_第5章_消息:Buffered vs Streamed、序列化和反序列化消息
- WCF序列化
- 再谈VS2008+Silverlight3+WCF+LINQtoSQL的部署和序列化
- 关于WCF数据契约和序列化的疑惑
- 【学习】WCF的服务契约、复杂类型序列化、消息契约的实现
- 深入学习WCF-序列化
- (WCF初体验)WCF的认证和消息保护
- 关于序列化,utf编码格式和unicode编码
- 【学习】WCF的服务契约、复杂类型序列化、消息契约的实现续-IXmlSerializable与MessageContract
- WCF Learning(4):WCF中的序列化[上篇]
- WCF Learning(4):WCF中的序列化[下篇]
- 序列化与编码
- 关于wcf客户端链接序列化问题
- WCF+Nhibernate 序列化的问题
- MyEclipse打开JSP文件报"Failed to create the part's controls"解决方法v
- IO模型和Select/Poll/Epoll解析
- BaseCode之日期工具类:DateUtil.java
- day11 soket编程之半关闭
- 括号配对问题 (南阳理工oj-题目2)
- wcf序列化和消息编码
- 微信小程序获取系统时间、时间戳、时间时间戳加减
- mysql基础
- Linux 设置编码格式&乱码
- HttpClient Get请求中返回中文乱码问题解决
- [html5入门-27]CSS布局奇淫巧计之-强大的负边距
- LeetCode 38. Count and Say
- javascript总结
- git中Please enter a commit message to explain why this merge is necessary. Please enter a commit mess