2

我有以下结构:

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>"
}

我得到以下异常:

不应使用数据合同名称“[某些 URI 文本]”键入“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,我是唯一一个认为这个网站上的输入字段很时髦的人吗?当我尝试格式化时,事情一直在变化......:| 很棒的网站,尽管我无法根据需要输入文本。

4

2 回答 2

4

您必须为您的服务接口添加一个 ServiceKnownTypeAttribute:

[ServiceKnownType(typeof(DerivedClass))]
public interface IService
{
    // Service declaration
}
于 2012-11-17T01:03:32.177 回答
0

有几种方法可以注册已知类型。但首先请阅读有关 DataContracts 和 DataContractSerializer支持的类型的文章

请注意,您没有DataContractDerivedClass 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.
}

如果要在服务合同级别注册已知类型,请ServiceKnownTypeServiceContract.

于 2012-11-17T01:55:27.687 回答