2013-01-06 108 views
9

繼承的類我有一個類SearchErrorException繼承和失敗時當過我嘗試從一個有效的JSON我得到下面的異常反序列化:Json.net嘗試反序列化,從異常

ISerializable type 'SearchError' does not have a valid constructor. To correctly implement ISerializable a constructor that takes SerializationInfo and StreamingContext parameters should be present. Path '', line 1, position 81. 

我試圖實現建議缺少的構造函數,並沒有幫助。

這是落實建議的構造後級:

public class APIError : Exception 
{ 
    [JsonProperty("error")] 
    public string Error { get; set; } 

    [JsonProperty("@http_status_code")] 
    public int HttpStatusCode { get; set; } 

    [JsonProperty("warnings")] 
    public List<string> Warnings { get; set; } 

    public APIError(string error, int httpStatusCode, List<string> warnings) : base(error) 
    { 
     this.Error = error; 
     this.HttpStatusCode = httpStatusCode; 
     this.Warnings = warnings; 
    } 

    public APIError(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) 
     : base(info, context) 
    { 
     Error = (string)info.GetValue("error", typeof(string)); 
     HttpStatusCode = (int)info.GetValue("@http_status_code", typeof(int)); 
     Warnings = (List<string>)info.GetValue("warnings", typeof(List<string>)); 
    } 
} 

現在我收到以下異常(也json.net代碼):

Member 'ClassName' was not found. 

我也試過實施與this related question相同的解決方案,也得到了上述相同的錯誤。

+0

分享您與人代碼.. –

+0

這個問題已經在這裏找到答案:http://stackoverflow.com/a/3423037/504836 – joelnet

回答

7

這個問題已經在這裏找到答案:https://stackoverflow.com/a/3423037/504836

添加一個新的構造

public Error(SerializationInfo info, StreamingContext context){} 

解決我的問題。

這裏完整代碼:

[Serializable] 
public class Error : Exception 
{ 

    public string ErrorMessage { get; set; } 

    public Error(SerializationInfo info, StreamingContext context) { 
     if (info != null) 
      this.ErrorMessage = info.GetString("ErrorMessage"); 
    } 
    public override void GetObjectData(SerializationInfo info,StreamingContext context) 
    { 
     base.GetObjectData(info, context); 

     if (info != null) 
      info.AddValue("ErrorMessage", this.ErrorMessage); 
    } 
} 
+2

而這個答案是無用的,因爲你不能總是隻添加一個成員到你不擁有的類。例如,我試圖序列化由實體框架拋出的DbUpdateConcurrencyException時發生此錯誤。我無法控制該類或其成員或拋出什麼樣的實例。 – Triynko

+0

@Lukasz Lysik是正確的,答案需要改進,但最好的改進實際上是一種簡化。我已經通過遍歷代碼並保存整個對象及其屬性來證實,唯一必須在GetObjectData中的語句是第一個,base.GetObjectData(info,context);我已經確認每個屬性都被填充,包括在.NET 2.0中受保護的HRESULT。這同樣適用於構造函數。 –

2

由於錯誤說,你缺少序列化的構造函數:

public class SearchError : Exception 
{ 
    public SearchError(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) 
    { 

    } 
} 
+0

我想你的建議,其我已經嘗試過,現在我得到了一些其他例外(見上文)。 –

+2

「:base(info,context)」引發異常「未找到成員'ClassName'」。 – joelnet

+0

@ joelnet:這是你的代碼問題,而不是答案。例如,請參閱MSDN鏈接:http://msdn.microsoft.com/en-us/library/tz6bzkbf.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2 –