序列化基类时,WCF调用失败,该基类是通用List<>

时间:2012-11-17 00:59:53

标签: c# xml wcf serialization inherited

我有以下结构:

public class DerivedClass : List<BaseClass>
{
   //Some helper methods used against the List of BaseClass properties

   //Methods
   public  List<BaseClass> GetListOfBaseClasses()
   {
       return (List<BaseClass>)this;
   }
}

我的WCF服务知道BaseClass对象,但客户端将其作为通用列表派生,现在当我尝试调用该服务时,如下所示:

DerivedClass classD;
FillData(classD)
List<BaseClass> baseClassList = classD.GetListOfBaseClasses();

using (IService myService = ObjectFactory.GetMyService())
{
      myService.DoSomething(baseClassList); //Method is expecting "List<BaseClass>"
}

我得到以下异常:

  

输入数据合约名称为“[some URI text]”的'DerivedClass'不是   预期。考虑使用DataContractResolver或不添加任何类型   静态地知道已知类型的列表 - 例如,通过使用   KnownTypeAttribute属性或通过将它们添加到列表中   传递给DataContractSerializer的已知类型。

我尝试以各种组合将这些属性添加到我的班级但仍然没有运气:

[Serializable]
[KnownType(typeof(List<BaseClass>))]
[XmlInclude(typeof(List<BaseClass>))]
[KnownType(typeof(BaseClass))]
[XmlInclude(typeof(BaseClass))]
public class DerivedClass : List<BaseClass>
{
  /// ...
}
PS-Sheehs,我是唯一一个认为这个网站上的输入字段很时髦的人吗?当我尝试格式化时,事情不断变化...:|伟大的网站,无论我无法按照自己的意愿输入文字。

2 个答案:

答案 0 :(得分:4)

您必须使用服务接口的ServiceKnownTypeAttribute:

[ServiceKnownType(typeof(DerivedClass))]
public interface IService
{
    // Service declaration
}

答案 1 :(得分:0)

register known types有几种方法。但首先请研究有关DataContracts的articlestypes supported by the DataContractSerializer

请注意,您未在DataContract DerivedClass上添加BaseClass属性。虽然标有Serializable属性的类是有效的并且可以在WSDL中公开,但DataContractAttibute具有为互操作性而设计的序列化规则,它是WCF的首选序列化机制。

如果您决定在数据合同上注册已知类型,那么这应该足够了:

[DataContract]    
public class DerivedClass : List<BaseClass>
{
  /// ...
}

[DataContract]
[KnownType(typeof(DerivedClass))]
public clas BaseClass
{
    //Add the DataMemberAttribute to the properties you want serialized.
}

如果要在服务合同级别注册已知类型,请在ServiceKnownType上添加ServiceContract属性。