我有以下结构:
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,我是唯一一个认为这个网站上的输入字段很时髦的人吗?当我尝试格式化时,事情不断变化...:|伟大的网站,无论我无法按照自己的意愿输入文字。
答案 0 :(得分:4)
您必须使用服务接口的ServiceKnownTypeAttribute:
[ServiceKnownType(typeof(DerivedClass))]
public interface IService
{
// Service declaration
}
答案 1 :(得分:0)
register known types有几种方法。但首先请研究有关DataContracts的articles和types 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
属性。