2013-11-21 20 views
0

我正在開發一個帶有兩個類的WCF作爲DataContracts。其中之一是我自己開發的一個數據結構,它管理對象爲JSON,它命名爲JSON;另一個只是我的WebService收到的定製對象,它命名爲Emission。我有三種方法;一個用於創建策略,另一個用於檢索策略,最後一個用JSON類以動態方式查閱目錄。我的問題出現在如下錯誤消息中:DataContract類中的列表<Object>的屬性失敗

「格式化程序嘗試反序列化消息時拋出異常:嘗試反序列化 參數時出錯... InnerException消息是'第1行位置出錯823.元素... 包含 'http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfanyType' 數據合約的數據。反序列化程序不知道映射到此合約的任何類型。 將與'ArrayOfanyType'相對應的類型添加到已知類型列表中 - for例如, 通過使用KnownTypeAttribute屬性或通過將其添加到傳遞給DataContractSerializer的已知類型列表。'。
請s ee InnerException獲取更多細節。「

我在找一個答案,然後我發現我的問題的原因是我的JSON類中的一個屬性,它是一個通用對象列表。我需要客戶端的這個屬性來初始化我期望接收的對象,所以這個列表可以包含字符串或另一個對象列表,這就是爲什麼我需要這種類型的項目。

我試着使用排序,但沒有成功KnownTypes的,但我不知道如果我做錯事

[KnownType(typeof(Object[]))] 
[KnownType(typeof(List<List<Object>>))] 
[KnownType(typeof(List<object>))] 
[KnownType(typeof(List<string>))] 
[KnownType(typeof(List<List<string>>))] 

可以說是很重要的,如果我SET財產內部即使價值屬性永遠不會顯示,一切都很好甚至JSON類在客戶端。附上我的代碼碎片:

public class JSON 
{ 
    #region 
    [DataMember] 
    public List<Object> value { get; set; } This cause the problem 
    //public List<Object> value { get; internal set; } This allow everything happens fine 
    [DataMember] 
    public List<string> errors { get; set; } 
    [DataMember] 
    public Regex pattern { get; internal set; } 
    [DataMember] 
    internal Regex commaPattern { get; private set; } 
    #endregion 
} 

[ServiceContract(Namespace = "http://EmissionService")] 
public interface IEmissionService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "Emissions/getCatalog", ResponseFormat = WebMessageFormat.Json)] 
    string getCatalog(JSON request); 

    [OperationContract] 
    [WebInvoke(UriTemplate = "Emissions/createPolicy", ResponseFormat = WebMessageFormat.Json, Method = "POST")] 
    string createPolicy(Emission emissionRequest); 

    [OperationContract] 
    [WebGet(UriTemplate = "Emissions/getPolicy", ResponseFormat = WebMessageFormat.Json)] 
    JSON getPolicy(JSON request); 
} 

我希望你能真正幫助我。感謝您的建議!

+0

爲什麼沒有'[KnownType(typeof(List ))]'列出? –

+0

嗯...你的意思是大寫的對象?其實我已經嘗試過兩種 – user3018905

回答

0

一個可能迴繞可以使用陣列,而不是在你的數據合同清單,並適當地服務中使用ToArray()ToList()

0

編譯器必須知道對象列表可以包含的所有類型,以使反序列化工作。