2010-08-06 22 views
10

estoy tratando de deserializar objeto derivado de la clase de excepción:¿Cómo deserializar el objeto derivado de la clase Exception usando 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");

Me da error:

tipo ISerializable 'tipo' no tiene un constructor válida.

+0

En primer lugar, esa no es la mejor manera de extender la clase 'Exception'. – thelost

+0

Me sorprende que incluso compile ya que no ha implementado la interfaz ISerializable. –

+1

ISerializable se define en la clase de excepción – Kikaimaru

Respuesta

15

Al agregar un nuevo constructor

public Error(SerializationInfo info, StreamingContext context){}
resolvió mi problema.

código Aquí completo:


    [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

No debe marcar 'info' en null, se garantiza que no es nulo :) –

6

Alternativamente, se puede elegir la estrategia OptIn y definir las propiedades que se deben procesar. En caso de que su ejemplo:

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

    [JsonConstructor] 
    public Error() { } 
} 

(Los créditos van a this biblioteca)

0

Añadiendo a respuestas agradables ya previstas;

Si la excepción proviene de una aplicación basada en Java, los códigos anteriores fallarán.

Para esto, sth. como a continuación se puede hacer en el constructor;

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

     } 
Cuestiones relacionadas