当我尝试调用WCF服务时出现此错误:
格式化程序在尝试反序列化时抛出异常 消息:尝试反序列化参数时出错 http://tempuri.org/:ResultValue。 InnerException消息是'错误 在第1行位置1741.元素 'HTP://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType的' 包含映射到名称的类型的数据 'HTP://schemas.datacontract.org/2004/07/DataAccess:人'。 反序列化器不知道映射到此名称的任何类型。 考虑使用DataContractResolver或添加对应的类型 '人'到已知类型的列表 - 例如,通过使用 KnownTypeAttribute属性或将其添加到已知类型列表中 传递给DataContractSerializer。'。
我有一个Interfaces项目,其中包含以下定义:
public interface IPerson
{
string Name { get; set; }
}
public interface IPersonExtended : IPerson
{
// If I remove the List of IPerson property, it works fine
List<IPerson> Contacts { get; set; }
}
我有一个实现接口的DataAccess项目:
public class Person : IPerson
{
public string Name { get; set; }
}
public class PersonExtended : IPersonExtended
{
public string Name { get; set; }
private List<IPerson> mContacts = new List<IPerson>();
// If I remove the List of IPerson property, it works fine
public List<IPerson> Contacts
{
get { return mContacts; }
set { mContacts = value; }
}
}
我的服务合同如下:
[ServiceContract]
[ServiceKnownType(typeof(Person))]
[ServiceKnownType(typeof(PersonExtended))]
public interface IMyService
{
[OperationContract]
ServiceCallResult<GetPeopleResponse> GetPeople(GetPeopleRequest request);
}
我的服务如下:
public class MyService : IMyService
{
public ServiceCallResult<GetPeopleResponse> GetPeople(GetPeopleRequest request)
{
GetPeopleResponse response = new GetPeopleResponse();
// Get Some people that have contacts
response.People = GetPeopleFromSomewhere();
ServiceCallResult<GetPeopleResponse> result =
new ServiceCallResponse<GetPeopleResponse> { ResultValue = response };
return result;
}
}
我的回复对象如下:
[DataContract]
[KnownType(typeof(PersonExtended))]
[KnownType(typeof(Person))]
[KnownType(List<Person>))]
[KnownType(List<PersonExtended))]
public class GetPeopleResponse
{
[DataMember]
public List<PersonExtended> People { get; set; }
}
Response对象只包含在包含状态信息等的MessageContract
对象中。
修改 如果我通过整个工作流删除联系人(列表)属性,它可以正常工作。我想知道它是否与尝试使用带有列表的属性而不是具体对象有关,但我不知道如何使用我的项目结构来解决这个问题而不添加循环引用。
答案 0 :(得分:2)
[DataContract]
类
[DataMember]
和Person
[DataContract]
public class Person : IPerson
{
[DataMember]
public string Name { get; set; }
}
KnownTypeAttribute
应该允许您为给定的DataContract
指定可接受的派生类。它指定在序列化或反序列化给定类型时DataContractSerializer
应识别的类型。
GetPeopleResponse
不是来自Person
或PersonExtended
...
你的代码中还有很多东西对我来说根本没有意义...... 这是对我有意义的事情......
public interface IPerson {
string Name { get; set; }
}
public interface IPersonExtended : IPerson {
List<IPerson> Contacts { get; set; }
}
[DataContract]
public class Person : IPerson {
[DataMember]
public string Name { get; set; }
}
[DataContract]
public class PersonExtended : Person, IPersonExtended {
[DataMember]
public List<Person> Contacts { get; set; }
public PersonExtended() {
Contacts = new List<Person>();
}
}
[ServiceContract]
public interface IMyService {
[OperationContract]
IList<PersonExtended> GetAllPeople();
}
public class MyService : IMyService
{
private IList<PersonExtended> _people;
public MyService() {
_people = new IList<PersonExtended>();
}
public IList<PersonExtended> GetAllPeople() {
return _people
}
}