如果你在使用WCF暴露服务而且使用svcutil.exe来为创建访问服务代码,一般情况下你不需要关心在客户端和服务端间传输的消息的线上表示。数据契约知道WCF把一个.NET类型序列化成一个XML信息集和讲一个XML信息集反序列化成一个.NET类型。XML信息集可能在线上以文件或者二进制形式编码,这些取决于通信过程中所使用的绑定,但是再次,.NET代码不会意识到编码的存在。这种方式就好比你在代码中使用.NET类型但是一个基于标准的XML信息集的编码表示在线上具体传输。
 
然而有很多种情况你需要在客户端和服务端使用不同的类型。如果客户端和服务端是不同组织开发的那么这很有可能,或者仅仅单边的通信是使用WCF。事实上,如果你不适用svcutil.exe或者添加服务引用来生成客户端代理,将会有很大的客户端成员名字与服务端成员名字不同的情况发生的可能。但是通过使用[DataMember]属性来控制这些名字,你可以让它们在XML表示中是相同的。只要客户端和服务端使用一个等效XML表示,对WCF来说,把XML信息反序列化成不同的.NET类型是可以的。如果两个类序列化成同样的XML元数据,数据契约表示的这些类可以被认为是一致的。对数据契约来说,要保持一致,它们必须有相同的命名空间,名字和成员。XML中的数据成员必须是同样的名字并且出现在同样的位置。简要的说,它们在线上必须是不可区分的。
 
列表2.26 显示了两个等效的数据契约。第一个契约由服务端暴露;第二个类由客户端描述。这两个契约是等效的而且生成了唯一的XML元数据定义。在服务端,默认情况下,WCF将会对XML元素按照字母顺序排列,所以第二个元数据将会强制数据元素按照字母顺序排列。因为名字为”StockPriceSvc”和名字为”Currency”的属性各自独立的存在于DataContract和DataMember中,XSD在第二个契约中生存的契约与第一个相同。
 
列表2.26 等效数据契约

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace EssentialWCF
{
[DataContract(Namespace="http://EssentialWCF")]
public class StockPriceSvc //V1
{
[DataMember] public double CurrentPrice;
[DataMember] public DateTime CurrentTime;
[DataMember] public string Ticker;
[DataMember] public string Currency;
}

[DataContract(Namespace = "http://EssentialWCF",

Name = "StockPriceSvc")]
public class StockPrice //V2
{
[DataMember(Order = 2)]
public double CurrentPrice;
[DataMember(Order = 3)]
public DateTime CurrentTime;
[DataMember(Order = 4)]
public string Ticker;
[DataMember(Order = 1, Name = "Currency")]
public string Money;
}
}

使用集合
集合是.NET中非常方便的数据结构,它集中了动态内存分配,枚举和列表指向的优势。尽管很有用,但是没有XSD或WCF的标准与一个集合等效。因此,讲一个集合序列化为XML,WCF需要将集合按照数组对待。事实上,一个集合的线上级别序列化与一个数组是一致的。另外对集合(类型继承于ICollection<T>)来说,这也是相同的,因为它的类型继承自IEnumerable<T>或者IList<T>.
 
列表2.27显示了一个使用集合的数据契约和操作。这个集合使用[CollectionDataContract]属性来修饰,它是特别用来提供这个目的的WCF的特别属性。这个属性指导WCF把任何支持IEnumerable接口并且实现了一个数组的Add方法的类型序列化成XML。StockPriceCollection类继承自List类,List类继承于ICollection基类接口来实现序列化。
 
列表2.27 从一个服务端暴露一个集合

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;

namespace EssentialWCF
{
[DataContract(Namespace = "http://EssentialWCF")]
public class StockPrice
{
[DataMember] public double CurrentPrice;
[DataMember] public DateTime CurrentTime;
[DataMember] public string Ticker;
}

[CollectionDataContract]
public class StockPriceCollection : List<StockPrice>
{
}

[ServiceContract]
public class StockService
{
[OperationContract]
private StockPriceCollection GetPriceAsCollection(string[] tickers)
{
StockPriceCollection list = new StockPriceCollection();
for (int i = 0; i < tickers.GetUpperBound(0) + 1; i++)
{
StockPrice p = new StockPrice();
p.Ticker = tickers[i];
p.CurrentPrice = 94.85;
p.CurrentTime = DateTime.Now;
list.Add(p);
}
return list;
}
}
}

WCF 第二章 契约 数据契约等效相关推荐

  1. 第二章 MATLAB数据与矩阵

    第二章 MATLAB 数据与矩阵 文章目录 第二章 MATLAB 数据与矩阵 2.1 MATLAB数据类型 2.2 变量和数据操作 2.2.1 变量与赋值 2.2.2 预定义变量 2.2.3 MATL ...

  2. ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出...

    ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出 前言:首先给大家说声"对不起",因为自从打算写这系列的文章以来,得到大家很多的支持 ...

  3. 运用计算机辅助电话调查的方法,第二章 统计数据的搜集、整理与显示

    "对统计学家来说,当今是统计学一切最重要活动的最重要的时期." "在花费同样的时间和劳动下,完整细致地检查数据的收集过程,或者说试验过程,常常会增加10倍或12倍的收益. ...

  4. 电路 第五版 第二章 电阻电路的等效变换

    第二章电阻电路的等效变换 2-1 引言 2-2 电路的等效变换 2-3 电阻的串联和并联 2-4 电阻的Y形联结和△联结 2-6 实际电源的两种模型一起等效变换 2-7 输入电阻

  5. 考研 | 组成原理【第二章】数据的表示和运算

    考研 | 组成原理[第二章]数据的表示和运算 文章目录 考研 | 组成原理[第二章]数据的表示和运算 I. 数制与编码 a. 进位计数制及其相互转换 b. BCD码 1. 8421码 2. 余3码 3 ...

  6. 计算机组成原理笔记(王道考研) 第二章:数据的表示和运算1

    内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记. 感谢LY,他帮我做了一部分笔记.由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些. 西电的计算机组织与体系 ...

  7. 计算机组成原理笔记(王道考研) 第二章:数据的表示和运算2

    内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记. 感谢LY,他帮我做了一部分笔记.由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些. 西电的计算机组织与体系 ...

  8. 数据挖掘第二章 认识数据

    数据挖掘第二章 认识数据 认识数据 2.1 数据对象与属性类型 2.2 数据的基本统计描述 2.2.1 中心趋势度量:均值.中位数和众数 2.2.2 度量数据散步:极差.四分位数.方差.标准差和四分位 ...

  9. WCF 第二章 契约

    在原子和金钱世界中,契约是两个或多个组织以一个已知的价格提供商品和服务的合同.在比特和服务的世界中,契约有类似的功能:它是两个或多个组织之间确定消息交换和消息条款及条件的合同. 契约是由服务终结点发送 ...

  10. WCF 第二章 契约 系列文章

    上一个系列向大家普及了什么是WCF? WCF 由什么组成? WCF 主要通过什么方式寄宿等等.给大家提纲挈领般的提出了一个总的概括,就相当于这个社会主体已经存在,我们下一步将要描述社会具体由什么组成的 ...

最新文章

  1. Brocade光纤交换机FOS升级
  2. java七大_Java 7七大新功能
  3. Python 中浅拷贝的四种实现方法
  4. Python中按指定长度分割字符串并反转
  5. VTK:绘制封顶球CappedSphere用法实战
  6. java剑姬_ListView和Adapter(文字列表)
  7. jzoj3798-[NOIP2014模拟8.22]临洮巨人【前缀和】
  8. iOS 移动端overflow:auto 滚动不平滑及bug处理
  9. unity多人游戏_如何使用Unity 2D和镜像构建多人纸牌游戏(更新)
  10. 【es】INDEX_CREATED the shard cannot be allocated to the same node a copy of the shard already
  11. 产品从无到有的方法框架——5MVVP框架,实际是如何运作的?
  12. 零束银河全栈技术解决方案之数字化体验平台产品篇
  13. CSS-table样式+
  14. 计算机题库启用宏,2009计算机一级:打开文件时一定要启用宏
  15. 为大家准备一份数据分析师简历的清单
  16. Mysql 分组查询取max 那条记录其他字段
  17. 高德地图-2D转换为3D
  18. 果断型性格分析,果断型人格的职业发展
  19. Anaconda3如何安装keras
  20. 【转】maven Failure to find xxx in 中央仓库

热门文章

  1. 远程机器上无法用Assembly.Load(path).CreateInstance(ClassName)?
  2. html to pdf
  3. 记一次RAID阵列的迁移经历
  4. Python学习杂记_1_PyCharm使用的一些收获
  5. MySQL--当事务遇到DDL命令
  6. oracle单行函数 之 字符函数
  7. 【编程题目】寻找丑数
  8. DirectX编译环境配置
  9. 经典人生感悟 看看你少了那一条
  10. 在Visual Studio 2008中安装mvc2.0(转)