WCF学习心得------(六)数据协定
--前言
最近各种事忙的把之前的WCF学习给耽误了一些,今天抽时间把之前的学习内容给总结了一下,因为知识点比较细碎没有做太多的练习示例,只是对其中关键的知识点做了总结,希望可以对大家有所帮助。
第六章 数据协定
6.1 数据协定的概述
默认的情况下WCF使用称之为数据协定序列化程序的序列化引擎对数据进行序列化和反序列化,所有的.NET Framework基元类型,如整型、字符串型,以及某些被视为基元的类型,如DateTime、XmlElement不需要做其他工作就可以被序列化,并被视拥有默认的数据协定。
在通常情况下通过DataContractAttribute属性应用到新建的复杂类型来完成复杂类型的序列化,此外该属性也可应用到类、结构和枚举。
在为复杂类型添加DataContractAttibute属性之后必须将DataMemberAttribute属性应用到数据协定类型的每个成员,表示应对这些数据成员进行序列化。
6.1.1 需要注意的关键点
l 数据协定使用“选择性加入”编程模型设计,对于未使用DataMemberAttribute属性标记的内容不序列化。
l DataMemberAttribute属性可应用于字段、属性、事件。
l 成员可访问性级别对数据协定无任何影响。
l DataMemberAttribute属性应用于静态成员时,该属性被忽略。
l 在序列化和反序列化期间,分别调用property-get或property-set代码进行序列化和反序列化(反序列化时先创建未初始化对象,而非在该类型上调用构造函数,最后反序列化所有数据成员)
l 对应将要生效的数据协定,必须能够序列化其所有数据成员。
l 泛型类型的处理方式与非泛型的处理完全相同。
6.2 数据协定的名称
在实际过程中,客户端、服务端可能共享不同的类型,只要数据协定相等,两端仍然可以相互传递数据。
需要注意的是完全限定的数据协定名称由命名空间+协定名称组成,而数据成员只有名称没有命名空间,且在处理协定时WCF对于命名空间、数据协定、数据成员等区分大小写。
具体的名称如下:
数据协定命名空间:
采用统一资源标识符,只需设置DataContractAttributed的NameSpace属性即可
示例:
[DataContract(Namespace="WCFDataContract")]
public class Hello {}
数据协定名称:
默认的数据协定的名称为该类型名,如果期望对其重命名可以通过DataContractAttributed的Name属性来实现
示例:
[DataContract(Name="Olive")]
Public class Hello{}
数据成员名称:
默认的数据成员的名称为该数据成员的名称,可以通过DataMemberAttributed的Name属性来对其进行重命名。
示例:
[DataMember(Name="LASTNAME")]
public string LastName { get; set; }
6.3 数据协定的等效性
数据协定的等效性分为三部分:数据协定的等效性和数据成员的等效性、数据成员顺序等效性。
6.3.1 数据协定和数据成员的等效性
要使数据协定等效,其命名空间和名称必须相同,在某一端上的每个数据成员还必须在另一端上有等效的数据成员。
要使数据成员等效,其名称必须相同,同时还必须表示同一类型的数据,即数据协定也必须等效。
如果发送或接受方存在两种类型,而其数据协定又不等效,则不应为其指定相同的名称和命名空间,否则会引发异常。
示例如下:
以下这两个数据协定是等效的
[DataContract]
Pulic class Customer
{
[DataMember]
Public string fullName;
[DataMember]
Public string telephoneNumber; } [DataContract(Name=’Customer”)]
Public class Person
{
[DataMember(Name=’fullName”)]
Private string nameOfPerson;
Private string address;
[DataMember(Name=’telephoneNumber”)]
Private string phoneNumber;
}
6.3.2 数据成员顺序的等效性
使用DataMemberAttribute类的Order属性可以影响数据协定的等效性,其成员必须以相同顺序出现,这样数据协定才会等效,默认按字母顺序。
示例:
[DataMember(Name="LASTNAME",Order=1)]
public string LastName { get; set; }
数据排序的基本规则:
- 如果数据协定类型为继承层次之一,则基类类型数据成员始终排在第一位
- 排在下一位的为当前数据类型的数据成员,默认按字母顺序排序,
- 再下边为设置了DataMemberAttribute属性的Order属性的数据成员,按order值升序排列,如果遇到多个成员有相同order值则对这些成员按字母排列。
示例如下:
[DataContract]
Public class BaseType
{
[DataMember]
Public string zebra;
}
[DataContract]
Public class DervicedType:BaseType
{
[DataMeber(Order=0)]
Public string bird;
[DataMember(Order=1)]
Public string parrot;
[DataMember]
Public string dog;
[DataMember(Order=3)]
Public string antelope;
[DataMember]
Public string cat;
[DataMember(Order=1)]
Public string albatross;
}
以上该协定产生的数据的顺序如下:
<DerivedType>
<zebra/>//首先是继承基类的数据成员
<cat/>//其次派生类中没有用order标注的数据成员,按照成员名的字母排序列车,c在的之前所以先是cat,然后是dog
<dog/>
<bird/>然后按照order属性的有小到大排列
<albatross/>//如果order值相等则按照数据名称排序
<parrot/>
<antelope/>
</DerivedType>
6.4 数据协定已知的类型
数据协定的已知类型有以下几种情况:
l 发送的数据协定源自于预期的数据协定(即发送的数据协定派生自服务端的数据协定)
l 要传输的信息的声明为接口
l 要传输的信息声明类型是Object
l 有些类型具有属于上述三种类别之一的成员,(包括.NET Framework类型)
KnownTypeAttribute类
通过首先检查传入消息选择为反序列化为实例化的类型,以确定消息内容遵循的数据协定,然后反序列话引擎尝试查找实现与消息内容兼容的数据协定的CLR类型。
反序列引擎在此过程中,允许的候选类型集成为反序列程序的“已知类型”集。
通过使用KnownTypeAttribute类型可以让反序列化引擎了解某个类型。
但是需要注意以下几点:
l 不能将数据协定用于单个数据成员,只能用于整个数据协定类型
l 可以将多个KnownTypeAttribute属性应用于同一类型
l 可将属性应用于可能成为类或结构的“外部类型”,应用属性会将其指定为已知类型,
6.5 数据协定版本管理
数据协定版本管理主要用来区分数据协定的重大更改和非重大更改,对数据协定的非重大更改并不影响应用程序的通信,但是如果是重大更改则会阻止单向或双向的通信。
对数据协定的哪些更改是重大更改呢?
l 更改数据协定的Name或Namespace值
l 通过DataMemberAttribute的Order属性来更改数据成员的顺序
l 重命名数据成员
l 更改数据成员的数据协定
l 将DataMemberAttribute的IsRequired属性设置为true即为必须数据成员,添加必须的数据成员是重大更改。
l 移除在任何早起版本中标记为必须成员的数据成员也是重大更改。
l 如果类型的任何早起版本都没有相应的数据成员,将该属性值从false更改为true就可能是重大改变。
以上这些都属于重大的更改。
需要注意的是:将IsRequired属性值从true更为false不是重大更改不是重大的更改
WCF学习心得------(六)数据协定的更多相关文章
- WCF学习心得----(五)生成客户端
WCF学习心得----(五)生成客户端 1. 通过Svcutil.exe工具直接生成客户端 1.1 将服务承载于IIS上 1.1.1 在IIS中新建网站,所示效果如下图: 1.1.2 ...
- WCF学习心得----(四)服务承载
WCF学习心得----(四)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...
- WCF学习心得----(三)服务承载
WCF学习心得----(三)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...
- WCF学习心得------(七)消息协定
第七章 消息协定 7.1 消息协定概述 通常情况下,在定义消息的架构时只使用数据协定就足够,但是有时需要精确控制如何将类型映射到通过网络传输的SOAP消息.对于这种情况,通常解决方案是插入自定义的SO ...
- WCF学习心得------(二)设计和实现服务协定
设计和实现服务协定 创建服务协定—WCF术语 消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头. 服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个 ...
- 我们一起学习WCF 第五篇数据协定和消息协定
A:数据协定(“数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每个参数或 ...
- WCF学习心得--客户端获取服务端自定义类数据
因项目需求,需要一个WCF服务,赶鸭子上架吧!下面直接切入正题! 首先创建WCF应用程序,具体如何创建就不赘述了,网上一大篇,我主要说说自己遇到的问题 问题一:超时问题,在最后获取数据的时候突然提示服 ...
- WCF学习心得------(三)配置服务
配置服务 配置服务概述 在设计和实现服务协定后,便可以进行服务的配置.在其中可以定义和自定义如何向客户段公开服务,包括指定可以找到服务的地址,服务用于发送和接受消息的传输和消息编码,以及服务需要的安全 ...
- WCF学习心得
之前很经常听说WCF,不过没有怎么接触过,直到最近才真正使用到WCF,虽然也只是皮毛而已,在此也做个记录总结吧. 下图是我使用WCF的练手项目,由于是使用VS2010直接创建的WCF服务应用程序,VS ...
随机推荐
- qq红心头像[中国心]制作教程之Photoshop教程
QQ红心头像[中国心]制作教程之Photoshop教程 中国最大的WEB开发资源网站及技术社区,阿里西西WEB开发 最近网络流传着很多qq红心头像,msn红心头像,中国心图标等等,最有些搞笑的是还有正 ...
- markdown简明语法
# markdown简明语法 标签(空格分隔): markdown 本语法只涵盖了常用的内容 [toc] 标题 标题 标题 语法为: 根据需求 可以指定 不同大小的标题 # 顶级 ## 次级 ### ...
- vim 的快捷操作
1, 假如你在第10行,你知道有一个错误在第100行.只需要: 90 ↓ 就会到达100行了 2,
- meta 标签 关键字 用处
您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站, 人们首先想到的方法无外乎以下几种: l 在搜索引擎中登录自己的个人网站 l 在知名网站加入你个人网 ...
- 装载:深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...
- Android关于主线程和非主线程
必须在主线程执行的任务: (1)UI更新 必须在非主线程中执行的任务 (1)Http请求 如执行:ImageHelper.getInstance().loadImageSync(picUrl); 外面 ...
- 《C标准库》——之<stdarg.h>
C语言有个很强大的功能,依靠它,实现了printf等这类有着变长参数列表的函数或者宏.它就是在<stdarg.h>里的变长参数. 内容: va_list :它是一个适合保存va_start ...
- c++内置函数---7
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 内置函数 调用函数时需要一定的时间和空间的开销.一般,函数调用包括5部分: 1.程序先执行函 数调用之前 ...
- HTML DOM部分---事件 windows对象;
<!--DOM操作windows对象操作 对浏览器进行操作document对象操作 对浏览器内页面文件进行操作 window.shuxing;属性调用格式window.fangfa();方法调用 ...
- leetcode 38 Count and Say ---java
这道题主要就是求一个序列,题目得意思就是 1 --> 11 --> 21 --> 1211 --> 111221 --> 312211 --> ..... 1个 ...