2014-05-16 72 views
3

我得到這個錯誤,當我嘗試調用WCF服務:WCF客戶端異常:錯誤嘗試反序列化參數

格式化拋出一個異常,而試圖反序列化 消息:時出錯同時試圖反序列化參數 http://tempuri.org/:ResultValue。 InnerException消息是'Error in line 1 position 1741.元素 'htp://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType' 包含來自映射到名稱的類型的數據 'htp ://schemas.datacontract.org/2004/07/DataAccess:人」。 反序列化程序不知道映射到此名稱的任何類型。 考慮使用DataContractResolver或將對應於 'Person'的類型添加到已知類型列表中 - 例如,使用 KnownTypeAttribute屬性或將其添加到傳遞給DataContractSerializer的已知類型列表 。

我有以下定義一個接口項目:

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

我有一個實現該接口數據訪問項目:

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); 
} 

我的服務KS這樣的:

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

響應對象只是包裹在一個包含狀態信息的MessageContract對象等

編輯 如果我通過整個工作流刪除了聯繫人(列表)屬性,它工作正常。我想知道它是否與嘗試使用具有列表的屬性而不是具體對象的界面相關,但我不確定如何在不添加循環引用的情況下繞過項目結構。

回答

2

你需要[DataContract][DataMember]Person

[DataContract] 
public class Person : IPerson 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 

KnownTypeAttribute應該允許您指定接受派生類中對於給定DataContract。它規定了DataContractSerializer應識別的類型序列化反序列化給定類型。

GetPeopleResponse不會PersonPersonExtended獲得...

也有是在你的代碼是沒有意義的東西很多都到我... 下面是一些有意義的我...

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 
    } 
} 
+0

我不這麼認爲。我已經更新了我的問題。這代表了我專有對象的簡化版本。 'ServiceCallResult'對象只是一個包含狀態等信息的包裝器。 –

+0

你在服務類的最後有一個return語句,它告訴我你不知道你在做什麼......服務類也不實現接口聲明的函數。 – furier

+0

其實,並不是我不知道我在做什麼。這是一個簡單的剪切/粘貼問題。我明顯地忽略了函數def,這需要在那裏才能滿足界面。 –

相關問題