--前言

最近各种事忙的把之前的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; }

数据排序的基本规则:

  1. 如果数据协定类型为继承层次之一,则基类类型数据成员始终排在第一位
  2. 排在下一位的为当前数据类型的数据成员,默认按字母顺序排序,
  3. 再下边为设置了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学习心得------(六)数据协定的更多相关文章

  1. WCF学习心得----(五)生成客户端

    WCF学习心得----(五)生成客户端 1.    通过Svcutil.exe工具直接生成客户端 1.1     将服务承载于IIS上 1.1.1 在IIS中新建网站,所示效果如下图: 1.1.2   ...

  2. WCF学习心得----(四)服务承载

    WCF学习心得----(四)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...

  3. WCF学习心得----(三)服务承载

    WCF学习心得----(三)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...

  4. WCF学习心得------(七)消息协定

    第七章 消息协定 7.1 消息协定概述 通常情况下,在定义消息的架构时只使用数据协定就足够,但是有时需要精确控制如何将类型映射到通过网络传输的SOAP消息.对于这种情况,通常解决方案是插入自定义的SO ...

  5. WCF学习心得------(二)设计和实现服务协定

    设计和实现服务协定 创建服务协定—WCF术语 消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头. 服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个 ...

  6. 我们一起学习WCF 第五篇数据协定和消息协定

    A:数据协定(“数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每个参数或 ...

  7. WCF学习心得--客户端获取服务端自定义类数据

    因项目需求,需要一个WCF服务,赶鸭子上架吧!下面直接切入正题! 首先创建WCF应用程序,具体如何创建就不赘述了,网上一大篇,我主要说说自己遇到的问题 问题一:超时问题,在最后获取数据的时候突然提示服 ...

  8. WCF学习心得------(三)配置服务

    配置服务 配置服务概述 在设计和实现服务协定后,便可以进行服务的配置.在其中可以定义和自定义如何向客户段公开服务,包括指定可以找到服务的地址,服务用于发送和接受消息的传输和消息编码,以及服务需要的安全 ...

  9. WCF学习心得

    之前很经常听说WCF,不过没有怎么接触过,直到最近才真正使用到WCF,虽然也只是皮毛而已,在此也做个记录总结吧. 下图是我使用WCF的练手项目,由于是使用VS2010直接创建的WCF服务应用程序,VS ...

随机推荐

  1. Windows Phone 8.1 Page transitions

    original: http://www.visuallylocated.com/post/2014/06/24/Page-transitions-and-animations-in-Windows- ...

  2. C语言----变量及作用域 、 指针 、 指针和数组 、 进程空间 、 字符串

    1 使用程序来模拟放球.取球的问题 1.1 问题 栈是一种特殊的线性表,它的逻辑结构和线性表相同,只是其运算规则较线性表有更多的限制,故又称为运算受限的线性表. 栈的定义是限制仅在表的一端进行插入和删 ...

  3. 基于 OpenSSL 的 CA 建立及证书签发 【转】

    建立 CA 建立 CA 目录结构 按照 OpenSSL 的默认配置建立 CA ,需要在文件系统中建立相应的目录结构.相关的配置内容一般位于 /usr/ssl/openssl.cnf 内,详情可参见 c ...

  4. Warning: Data truncated for column 'AirPress' at row 1

    /************************************************************************ * Warning: Data truncated ...

  5. js缓速运动

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  6. Mysql时间戳函数

    1.转换为时间戳 select unix_timestamp('2013-07-15 10-06-07') 如果参数为空,则为当前时间 2.转换为时间 select from_unixtime(tim ...

  7. Windows 10下Chrome不能启动的问题

    不能启动了 Chrome突然不能启动了,点击图标也没反应,打开任务管理器,发现点击图标后,Google Ghrome短暂地出现,随即消失. 如何解决? 解决方案 打开安装目录: C:\Program ...

  8. [转载]架构指南 : Java1.7+Eclipse luna + Maven 3.2.5 +spring 4.1.4

    1. 环境配置 a)         Java 1.7 b)         Eclipse luna c)         Maven3.2.5 d)         spring 4.1.4 2. ...

  9. xcode中的一些快捷键

    隐藏xcode command+h退出xcode command+q关闭窗口 command+w关闭所有窗口 command+option+w关闭当前项目 command+control+w关闭当前文 ...

  10. Bash 使用技巧

    Bash 是我们经常与之打交道的 Shell 程序,本文针对其使用技巧进行了搜罗.相信在你看过这些内容之后,定会在 Bash 的世界里游刃有余. 从历史中执行命令 有时候,我们需要在 Bash 中重复 ...