2010-08-06 4 views
10

Je suis en train de désérialiser objet dérivé de la classe d'exception:Comment désérialiser un objet dérivé de la classe Exception à l'aide de 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");

Il me donne l'erreur:

Type ISerializable 'type' ne dispose pas d'un constructeur valide.

+0

Tout d'abord, ce n'est pas la meilleure façon d'étendre la classe 'Exception'. – thelost

+0

Je suis surpris que même compile puisque vous n'avez pas implémenté l'interface ISerializable. –

+1

ISerializable est défini sur la classe d'exception – Kikaimaru

Répondre

15

Ajout d'un nouveau constructeur

public Error(SerializationInfo info, StreamingContext context){}
résolu mon problème.

code ici complet:


    [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

Vous ne devriez pas vérifier 'info' sur null, c'est la garantie d'être non-nul :) –

6

Alternativement, vous pouvez choisir la stratégie OptIn et définir les propriétés qui doivent être traitées. En cas de votre exemple:

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

    [JsonConstructor] 
    public Error() { } 
} 

(Crédits aller à this bibliothèque)

0

Ajout à déjà fourni des réponses belles;

Si l'exception provient d'une application Java, les codes ci-dessus échoueront.

Pour cela, sth. comme ci-dessous peut être fait dans le constructeur;

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

     } 
Questions connexes