WCF学习(五):数据契约之已知类型2012-01-26 博客园 Henllyee Cui准备技术: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.