WCF学习(五)数据契约之已知类型

准备技术:

     1.C#基础知识

     2.了解WCF基础知识

 

 

     在正常的c#开发中我们是允许用子类去替换基类的,这也是所谓的替换原则。但是我们在WCF中确不能用数据契约的子类来替换父类的,因为这中间存在一个序列化的问题。举个例子:

     我们有数据契约:

          [DataContract]

          class Employee{...}

     服务契约中:

          [ServiceContract]

          interface IEmployeeManager

          {

               [OperationContract]

               void AddEmployee(Employee employee);

          }

     然后我们在客户端的代理中就算有类:Intern继承于

          [DataContract]

          class Intern:Employee{...}

     然后再客户端调用时:

          proxy.AddEmployee(new Intern())是会出错的。因为在服务器端无法识别Intern对象,因为他无法去反序列化Intern成Employee对象(WCF序列化)。

     

     

     WCF提供给我们了一个解决的办法就是使用KnownTypeAttribute特性,在基类上标识对应的子类就可以了。KnownTypeAttribute特性可以使用在Struct跟Class上。示例:

          [DataContract]

          [KnownType(typeof(Customer))]

          class Employee{...}

          

          [DataContract]

          class Intern:Employee{...}

这样我们就在所有的契约跟操作上,能跨越所有的服务和终结点,允许服务接受子类。但是这样会遇到一个问题,我们不能去特定的指定某一个服务操作,所以KnownType的缺陷就是范围过于广泛。WCF提供了另外一个Attribute--ServiceKnownType.

 

ServiceKnownType 特性

     KnownType只能应用在数据契约的基类上,而ServiceKnownType可以在Interface、Method、Class上标识。看一个示例Employee.cs:

 

ContractedBlock.gifExpandedBlockStart.gifCode
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace HenllyeeDataContract
{
    [DataContract]
    
public class Employee
    {
        
#region Fields
        
private string _name;
        
private int _age;
        
#endregion

        
#region Properties
        
/// <summary>
        
/// The employee's name
        
/// </summary>
        [DataMember(Order=0)]
        
public string Name
        {
            
get 
            {
                
return this._name;
            }
            
set
            {
                
this._name = value;
            }
        }

        
/// <summary>
        
/// The employee's age
        
/// </summary>
        [DataMember(Order=1)]
        
public int Age
        {
            
get
            {
                
return this._age;
            }
            
set
            {
                
this._age = value;
            }
        }
        
#endregion
    }

    [DataContract]
    
public class Intern : Employee
    {
        
private int _internship;

        
/// <summary>
        
/// The intern's working days
        
/// </summary>
        [DataMember]
        
public int Internship
        {
            
get
            {
                
return this._internship;
            }
            
set
            {
                
this._internship = value;
            }
        }
    }
}

 

在数据契约中我们并没有去指定KnownType,我们在服务契约的操作上去标识ServiceKnownType特性,EmployeeManage.cs:

 

 

ContractedBlock.gifExpandedBlockStart.gifCode
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace HenllyeeServiceContract
{
    [ServiceContract]
    
public interface IEmployeeManage
    {
        [OperationContract]
        [ServiceKnownType(
typeof(HenllyeeDataContract.Intern))]
        
void AddEmployee(HenllyeeDataContract.Employee emlpoyee);

        [OperationContract]
        [ServiceKnownType(
typeof(HenllyeeDataContract.Intern))]
        HenllyeeDataContract.Employee GetEmployee();
    }

    [ServiceBehavior(InstanceContextMode
=InstanceContextMode.Single)]
    
public class EmployeeManage : IEmployeeManage
    {
        
private HenllyeeDataContract.Employee _employee;

        
/// <summary>
        
/// Set employee
        
/// </summary>
        
/// <param name="emlpoyee">the employee's object</param>
        public void AddEmployee(HenllyeeDataContract.Employee emlpoyee)
        {
            
this._employee = emlpoyee;
        }

        
/// <summary>
        
/// Get a employee
        
/// </summary>
        
/// <returns></returns>
        public HenllyeeDataContract.Employee GetEmployee()
        {
            
return this._employee;
        }
    }
}

 

在客户端我们调用:

 

 

ContractedBlock.gifExpandedBlockStart.gifCode
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Client
{
    
class Program
    {
        
static void Main(string[] args)
        {
            EmployeeService.EmployeeManageClient proxy 
= new Client.EmployeeService.EmployeeManageClient();
            EmployeeService.Intern intern 
= new Client.EmployeeService.Intern();
            intern.Age 
= 22;
            intern.Name 
= "Henllyee Cui";
            intern.Internship 
= 120;
            proxy.AddEmployee(intern);

            EmployeeService.Employee internOut 
= proxy.GetEmployee();
            Console.Write(
"The Employee Name:{0}\nAge:{1}\n",
                internOut.Name,
                internOut.Age
                );
            Console.Read();
        }
    }
}

运行后: 

     ServiceKnownType特性也可以表示在数据契约的类上,那么就会应用到整个数据契约中操作上,如:

          [ServiceContract]

          [ServiceDataContract(typeof(HenllyeeDataContract.Intern))]

          public interface IEmployeeManage{...}

     那么IEmployeeManage服务契约跟其所有的操作都可以接受Intern这个子类.

已知类型与接口

     数据契约DataContract只能标识在class 或者struct上,但是数据契约的基类可以是接口,但是我们在服务契约的时候要去用ServiceKnownType特性去指定确切的数据类型。如:

     interface IEmployee{...}

     [DataContract]

     class Intern:IEmployee{...}

服务契约中:

     [ServiceContract]

     [ServiceKnownType(typeof(Intern))]

     interface IEmployeeManage

     {

          [OperationContract]

          void AdddEmployee(IEmployee employee);

     }

要注意的一点就是我们不能把KnownType特性应用到基接口上,因为客服端导出的元数据是不能包含接口本身的。

[代码下载]

作者:Henllyee Cui
出处: http://henllyee.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。

转载于:https://www.cnblogs.com/Henllyee/archive/2008/08/26/1276995.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10必须禁用的服务_7寸屏的迷你电脑,就算是8GB运行内存,也必须关闭的系统选项...

现在的电脑&#xff0c;基本上都安装的是Win10系统了&#xff0c;7寸屏的迷你笔记本电脑GPD Pocket 2琥珀黑版也不例外&#xff0c;GPD Pocket 2采用的是赛扬双核3965y处理器&#xff0c;8G运行内存&#xff0c;处理办公应用可以说是游刃有余&#xff0c;但是Win10系统有一些选…

iTunes只能装C盘吗_电脑技巧分享:安装win10系统时系统盘C盘分区多大空间适合?...

我们在使用电脑时为了对电脑文件的方便管理&#xff0c;往往会对电脑进行分区&#xff0c;比如C&#xff0c;D&#xff0c;E&#xff0c;F盘等&#xff0c;其中C盘默认为系统盘&#xff0c;用于存储操作系统的重要文件&#xff0c;而C盘的分区大小也是许多朋友在安装操作系统时…

上海梵科信息科技有限公司

1. a5, b(a)(a)(a), printf("%d",b); 答案&#xff1a;19 2. 表students&#xff0c;有id, classid, name, score。 班级为4的所有学生&#xff1f; 答案&#xff1a;select * from students where classid4 每个班级的学生总数&#xff1f; 答案&#xff1a;select …

python36安装numpy_安装numpy

为了运行机器学习书上的实例&#xff0c;安装numpy.照着网上教程安装的&#xff0c;网上教程 1&#xff09;下载numpy包 自己的是python3.5, 64位操作系统&#xff0c;所以选择numpy-1.11.2mkl-cp35-cp35m-win-amd64.whl 2&#xff09;安装numpy 将下载的包拷贝到python安装目录…

WCF Testing Tool(转)

原文:http://jayce.clearviewtickets.info/wcftestingtool.html best video: wcf testing tool IIS7 Admin Pack Offers Built In Performance Analysis Reports Are you web developer building high traffic web site? Are you performance engineer that lives and breath…

python制作简单动画_如何使用python制作简单的动画?

Python真的是无穷的好用&#xff0c;涉及内容非常广泛&#xff0c;比如接下来给大家介绍的制作动画&#xff0c;就可以利用python实现&#xff0c;相信小伙伴们听到这些内容肯定是非常感兴趣的&#xff0c;至于怎么去实现&#xff1f;大家想不想了解呢&#xff1f;下面小编就给…

clickhouse语句_篇四|ClickHouse的可视化界面与集群状态监控

介绍 tabix支持通过浏览器直接连接 ClickHouse&#xff0c;不需要安装其他软件&#xff0c;就可以访问ClickHouse&#xff0c;具有以下特点&#xff1a;⾼亮语法的编辑器。⾃动命令补全。查询命令执⾏的图形分析⼯具。配⾊⽅案选项。除此之外&#xff0c;还可以使用DBeaver连接…

apache为什么更适合处理动态请求_[适合初中级Java程序员修炼手册从0搭建整个Web项目](一)...

前言文本已收录至我的GitHub仓库&#xff0c;欢迎Star&#xff1a;https://github.com/bin392328206种一棵树最好的时间是十年前&#xff0c;其次是现在six-finger-web一个Web后端框架的轮子从处理Http请求【基于Netty的请求级Web服务器】 到mvc【接口封装转发)】&#xff0c;再…

python如何自动缩进_Python缩进

缩进出现问题&#xff0c;运行不出来。 正确代码如下&#xff1a;1 defbinary_search(list, item):2 low 03 high len(list)-1 4 5 while low <high:6 mid (low high)7 guess list[mid]8 if guess item:9 returnmid10 if guess >item:11 high mid-1 12 else:13 low m…

差分约束系统详解

一直不知道差分约束是什么类型题目&#xff0c;最近在写最短路问题就顺带看了下&#xff0c;原来就是给出一些形如x-y<b不等式的约束&#xff0c;问你是否满足有解的问题 好神奇的是这类问题竟然可以转换成图论里的最短路径问题&#xff0c;下面开始详细介绍下 比如给出三…

1.1.1.1校园网_Apache Flink 1.11.0 重要功能全面解析

来源 | Apache Flink 官方博客翻译 | 高赟(云骞)Apache Flink 社区很荣幸的宣布 Flink 1.11.0 版本正式发布&#xff01;超过 200 名贡献者参与了 Flink 1.11.0 的开发&#xff0c;提交了超过 1300 个修复或优化。这些修改极大的提高了 Flink 的可用性&#xff0c;并且增强了各…

显示控制器注释_欧姆龙可编程控制器CS1D-CPU产品型号说明及功能介绍

欧姆龙可编程控制器CS1D-CPU用CPU单元 CPU单元(用于双CPU系统)欧姆龙可编程控制器CS1D-CPU用CPU单元 特点可以轻松引入、使用高可靠性系统成双配备CPU单元轻松易行CPU单元内的程序或内部数据在活动/备用CPU之间完全进行自动传送并进行同步。 无需选择要同步的数据或单独进行传送…

js取字符串后四位_JS逆向 | 某验滑块加密参数逆向分析

声明&#xff1a;本文只作学习研究&#xff0c;禁止用于非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01;aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s抓包分析&#xff0c;看到一个加密参数w&…

挖掘城市ip_德国卡尔斯草莓农庄:旅游IP打造要创意更要形象!

什么是IP?名人圈&#xff1a;杨超越游戏圈&#xff1a;王者荣耀影视界&#xff1a;延禧攻略出版界&#xff1a;Harry Potter相声界&#xff1a;郭德纲……别忙着争先恐后&#xff0c;知道你的IP数不胜数~~你知道的IP数不胜数&#xff0c;一个人、一部作品、一个品牌、一座城市…

rust种的南瓜为什么老是消失_冷天早餐别将就,用南瓜和萝卜这样做,鲜香松软,营养好吃又管饱...

导语&#xff1a;11月我家爱吃这菜&#xff0c;加根萝卜简单一卷&#xff0c;有颜有料&#xff0c;孩子经常点名吃。冷天早餐别将就&#xff0c;用南瓜和萝卜这样做&#xff0c;鲜香松软&#xff0c;营养好吃又管饱“南瓜再大本地卖&#xff0c;辣椒再小穿省过”记得悦悦小时候…

windows下搭建python运行环境

今天python的环境炸了&#xff0c;刚好也重新做一下&#xff0c;记录下折腾的过程。 文件下载 首先打开官网&#xff0c;找到对应的文件的下载索引。 https://www.python.org/downloads/windows/ 其中3.7.0是版本号&#xff0c;a是代表稳定版本&#xff0c;b代表的是测试版本&…

python中isalpha的用法_python函数--isalpha()方法

原博文 2019-09-26 10:59 − isalpha()方法 描述&#xff1a;Python isalpha() 方法检测字符串是否只由字母组成。isalpha()方法语法&#xff1a;str.isalpha()参数&#xff1a;无。返回值&#xff1a;如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False…

C#数据结构-单链表

理论基础&#xff1a; 链表是用一组任意的存储单元来存储线性表中的数据元素。 如果结点的引用域只存储该结点直接后继结点的存储地址&#xff0c;则该链表叫单链表(Singly Linked List)。 单链表由头引用H唯一确定。头引用指向单链表的第一个结点&#xff0c;也就是把单链表第…

pandas 根据单号分类_由 “猫捉老鼠”游戏联想的用户分类问题

一、说在最前 用户识别&#xff0c;用户分类&#xff0c;精准营销…这是咱们业务人员常常念叨的话。底层逻辑为无论任何营销目的&#xff0c;在营销手段上&#xff0c;越针对某一细化群体&#xff0c;达成目的的概率也就会越大。那今天就来和大家说道说道用户识别/分类的一种方…

arraylist从大到小排序_java基础算法之二叉树排序(递归)

一、二叉树介绍在计算机科学中&#xff0c;二叉树是每个结点最多有两个子树的树结构。二叉树由各种节点组成&#xff0c;如下图所示&#xff1a;每个节点都可以有左子节点&#xff0c;右子节点每一个节点都有一个值二叉树遍历&#xff1a;二叉树的遍历分左序&#xff0c;中序&a…