我们以前为大家介绍过WCF数据契约的相关特点以及应用技巧。在这里我们将会继续根据WCF数据契约的不同类型的应用举例说明,以方便大家更进一步的对这方面内容有一个深入的了解。
在正常的c#开发中我们是允许用子类去替换基类的,这也是所谓的替换原则。但是我们在WCF中确不能用数据契约的子类来替换父类的,因为这中间存在一个序列化的问题。举个例子:
我们有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{...}
这样我们就在所有的WCF数据契约跟操作上,能跨越所有的服务和终结点,允许服务接受子类。但是这样会遇到一个问题,我们不能去特定的指定某一个服务操作,所以KnownType的缺陷就是范围过于广泛。WCF提供了另外一个Attribute--ServiceKnownType.
【编辑推荐】