2010-08-06 45 views
10

Tôi đang cố gắng để deserialize đối tượng có nguồn gốc từ lớp Exception:Làm thế nào để deserialize đối tượng bắt nguồn từ lớp ngoại lệ bằng cách sử dụng Json.net (C#)?

[Serializable] 
    public class Error : Exception, ISerializable 
    { 
    public string ErrorMessage { get; set; } 
    public Error() { } 
    } 

Error error = JsonConvert.DeserializeObject< Error >("json error obj string");

Nó mang lại cho tôi lỗi:

ISerializable loại 'loại' không có một constructor hợp lệ.

+0

Thứ nhất, đó không phải là cách tốt nhất để mở rộng lớp 'Ngoại lệ'. – thelost

+0

Tôi ngạc nhiên khi biên dịch ngay cả khi bạn chưa thực sự triển khai giao diện ISerializable. –

+1

ISerializable được định nghĩa trên lớp Exception – Kikaimaru

Trả lời

15

Thêm một hàm tạo mới

public Error(SerializationInfo info, StreamingContext context){}
giải quyết được sự cố của tôi.

mã ở đây hoàn toàn:


    [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); 
     } 
    } 
 
+0

Bạn không nên kiểm tra 'thông tin' trên null, nó đảm bảo là không-null :) –

6

Ngoài ra, bạn có thể chọn chiến lược OptIn và xác định các thuộc tính cần được xử lý. Trong trường hợp ví dụ của bạn:

[JsonObject(MemberSerialization.OptIn)] 
public class Error : Exception, ISerializable 
{ 
    [JsonProperty(PropertyName = "error")] 
    public string ErrorMessage { get; set; } 

    [JsonConstructor] 
    public Error() { } 
} 

(Tín đi đến this thư viện)

0

Thêm vào câu trả lời thoải mái đã được cung cấp;

Nếu ngoại lệ đến từ một ứng dụng dựa trên java, thì các mã ở trên sẽ không thành công.

Đối với điều này, sth. như dưới đây có thể được thực hiện trong hàm tạo;

 public Error(SerializationInfo info, StreamingContext context) 
     { 
      if (info != null) 
      { 
       try 
       { 
        this.ErrorMessage = info.GetString("ErrorMessage"); 
       } 
       catch (Exception e) { 
        **this.ErrorMessage = info.GetString("message");** 
       } 
      } 

     } 
Các vấn đề liên quan