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.

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, wcf
, 服务
, 子类
, intern()
, 一个
intern
,以便于您获取更多的相关知识。

时间: 2024-12-27 08:15:02

WCF学习(五):数据契约之已知类型的相关文章

WCF技术剖析之十三:序列化过程中的已知类型(Known Type)

DataContractSerializer承载着所有数据契约对象的序列化和反序列化操作.在上面一篇文章(<数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)>)中,我们谈到DataContractSerializer基本的序列化规则:如何控制DataContractSerializer序列化或者反序列化对象的数量:以及如何在序列化后的XML中保存被序列化对象的对象引用结构.在这篇文章中,我们会详细讨论WCF序列化中一个重要的话题:已知类型

WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用

如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML.反之,对于一段给定的基于数据契约的XML,要通过反序列化生成该类型的对象,我们该如何实现这样的场景? 比如下面定义了两个类型Contact和Customer,其中Customer是数据契约,Contact的Sex属性相当于Customer的Gender属性,而Contact的FullName可以看成是Customer的FirstName和LastName的组合.现在我们要做的是

关于WCF的共享数据契约疑问

最近在做项目的时候,发现同一个数据契约再客户端隶属于两个不同的命名空 间,为此如果两个服务进行交互的时候会涉及到类型 的问题,互操作性很差,要进 行不必要的拆和装,在前面终于让我找到了答案,下面我来描述一下这个场景,大家 请看下面. [实体类] 大家请注意命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace GaryChenWCFService {

WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用

原文:WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML.反之,对于一段给定的基于数据契约的XML,要通过反序列化生成该类型的对象,我们该如何实现这样的场景? 比如下面定义了两个类型Contact和Customer,

WCF学习(三):数据契约1

WCF能够托管CLR类型,客户端能传递和处理CLR类型的数据(如:string和int),但是如果我们自己定义的类型(如:声明的Customer类).其实WCF的传递CLR自己类型时,是因为已经把它序列化成了xml信息集,而我们自己定义的类型则需要自己去显示的声明序列化. 序列化 .net的序列化..net是通过反射机制(反射机制参考文档)自动实现对象的序列化与反序列化.首先.net能够捕获对象每个字段的值,然后进行序列化,反序列化时,.net创建一个对应类型的新的对象,读取持久化的值,然后设置

WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)

原文:WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]大部分的系统都是以数据为中心的(Data Central),功能的实现表现在对相关数据的正确处理.而数据本身,是有效信息的载体,在不同的环境具有不同的表示.一个分布式的互联系统关注于数据的交换,而数据正常交换的根本前提是参与数据交换的双方对于数据结

WCF学习(四):数据契约的事件

技术准备: 1.dotnet基本开发: 2.WCF的数据契约跟服务契约的基本使用 内容: 我们都知道数据契约其实也是服务器端到客户端序列化跟反序列化,这样的序列化跟asp.net ajax访问webservice是很像的.asp.net ajax 一般是将服务器端的数据序列化成jason字符串传递给前台脚本的但是我们在序列化或则反序列化的时候也许会要去控制一些数据契约里面的Filed或则Attributes,这就需要我们去监听数据契约在序列化及反序列化时触发的一些事件. 数据契约的事件 数据契约

WCF分布式开发步步为赢(7):WCF数据契约与序列化

本节继续学习WCF分布式开发步步为赢(7):WCF数据契约与序列化.数据契约是WCF应用程序开发中一个重要的概念,毫无疑问实现客户端与服务端数据契约的传递中序列化是非常重要的步骤.那么序列化是什么?为什么会有序列化机制?或者说它是为了解决什么问题?作用是什么?现有的.NET 序列化机制和WCF序列化机制有什么不同?我们在本节文章里都会详细介绍.本节结构:[0]数据契约[1]序列化基本概念[2].NET 序列化机制[3]WCF序列化机制[4]代码实现与分析[5]总结. 下面我们正式进入今天的学习阶

WCF技术剖析之十六:数据契约的等效性和版本控制

数据契约是对用于交换的数据结构的描述,是数据序列化和反序列化的依据.在一个WCF应用中,客户端和服务端必须通过等效的数据契约方能进行有效的数据交换.随着时间的推移,不可避免地,我们会面临着数据契约版本的变化,比如数据成员的添加和删除.成员名称或者命名空间的修正等,如何避免数据契约这种版本的变化对客户端现有程序造成影响,就是本节着重要讨论的问题. 一.数据契约的等效性 数据契约就是采用一种厂商中立.平台无关的形式(XSD)定义了数据的结构,而WCF通过DataContractAttribute和D