WCF经过长时间的发展,很多用户都很了解WCF了,这里我发表一下个人理解,和大家讨论讨论。大家请注意ClassWillProcessl类型,我们需要增加哪些类型到KnownType中呢?如果我们在应用中可能将ClassB的实例赋值给ca的话,我们需要增加ClassB到KnowType中([KnowType(typeof(ClassB))]),因为ClassB派生于ClassA,所以在反序列化时存在向下造型。如果不存在这种可能性的话,可以不加。
#T#由于ia的声明类型是一个接口,所以我们需要将接口的实现类加到WCF KnownType中。在这里是ImplA和ImplB。试想一下,如果我们只增加了ImplA到KnownType中,并且我们将ImplB的实例赋给了ia,反序列化引擎还是会将其反序列化成ImplA,因为它只知道ImplA.如果我们arraylist1集合中可能会将ClassC和ClassD放入其中,由于非泛型集合都是使用Object来保存实际对象,所以我们也需要将ClassC和ClassD加入到WCF KnownType中。如果我们也希望将一个int的数组存放在numberValue中(当然在实际情况中很少发生),我么也需要将int[]加入到WCF KnownType中。
增加了KnownType的ClassWillProcessl类型如下:
- [DataContract]
- [KnowType(typeof(ClassB))]
- [KnowType(typeof(ImplA))]
- [KnowType(typeof(ImplB))]
- [KnowType(typeof(ClassC))]
- [KnowType(typeof(ClassD))]
- [KnowType(typeof(int[]))]
- Public class ClassWillProcess
- {
- [DataMember]
- ClassA ca;
- [DataMember]
- InterfaceA ia;
- [DataMember]
- ArrayList arraylist1;
- Object numberValue;
- [DataMember]
- Public object Numbers
- {
- get {return numberValue;}
- set {numberValue=value;}
- }
- }