wcf KnownTypeAttribute 武胜

KnownTypeAttribute与ServiceKnownTypeAttribute

对于已知类型,可以通过两个特殊的自定义特性进行设置:KnownTypeAttribute和 ServiceKnownTypeAttribute。KnownTypeAttribute应用于数据契约中,用于设置继承与该数据契约类型的子数据契 约类型,或者引用的其他潜在的类型。ServiceKnownTypeAttribute既可以应用于服务契约的接口和方法上,也可以应用在服务实现的类 和方法上。应用的目标元素决定了定义的已知类型的作用范围。下面的代码中,在基类OrderBase指定了子类的类型Order。

 1: [DataContract]
 2: [KnownType(typeof(Order))]
 3: public abstract class OrderBase : IOrder
 4: {
 5: //省略成员
 6: }

而ServiceKnownTypeAttribute特性,仅可以使用在服务契约类型上,也可以应用在服务契约的操作方法上。如果应用在服务契约 类型上,已知类型在所有实现了该契约的服务操作中有效,如果应用于服务契约的操作方法上,则定义的已知类型在所有实现了该契约的服务对应的操作中有效。

 1: [ServiceContract]
 2: [ServiceKnownType(typeof(Order))]
 3: public interface IOrderManager
 4: {
 5: [OperationContract]
 6: void ProcessOrder(OrderBase order);
 7: }
 1: [ServiceContract]
 2: public interface IOrderManager
 3: {
 4: [OperationContract]
 5: [ServiceKnownType(typeof(Order))]
 6: void ProcessOrder(OrderBase order);
 7: }

ServiceKnownTypeAttribute也可以应用于具体的服务类型和方法上面。对于前者,通过ServiceKnownTypeAttribute定义的已知类型在整个服务的所有方法中有效,而对于后者,则已知类型仅限于当前方法。

 1: [ServiceKnownType(typeof(Order))]
 2: public class OrderManagerService : IOrderManager
 3: { 
 4: public void ProcessOrder(OrderBase order)
 5: {
 6: //省略成员
 7: }
 8: }
 1: public class OrderManagerService : IOrderManager
 2: {
 3: [ServiceKnownType(typeof(Order))]
 4: public void ProcessOrder(OrderBase order)
 5: {
 6: //省略成员
 7: }
 8: }

除了通过自定义特性的方式设置已知类型外,已知类型还可以通过配置的方式进行指定。已知类型定义 在<system.runtime.serialization>配置节中,采用如下的定义方式。这和我们在上面通过 KnownTypeAttribute指定Order类型是完全等效的。

 1: <?xml version="1.0" encoding="utf-8" ?>
 2: <configuration>
 3: <system.runtime.serialization>
 4: <dataContractSerializer>
 5: <declaredTypes>
 6: <add type="Artech.DataContractSerializerDemos.OrderBase,Artech.DataContractSerializerDemos.KnownTypes">
 7: <knownType type="Artech.DataContractSerializerDemos.Order,Artech.DataContractSerializerDemos.KnownTypes"/>
 8: </add>
 9: </declaredTypes>
 10: </dataContractSerializer>
 11: </system.runtime.serialization>
原文地址:https://www.cnblogs.com/zeroone/p/2454785.html