C# 有没有反序列化异常对象的方法?

C# 有没有反序列化异常对象的方法?,c#,exception,json.net,deserialization,C#,Exception,Json.net,Deserialization,我正在从事WCF REST项目。在WCF/服务器端,每当catch块中发生异常时,我都会执行下面的操作,并在响应客户端时将异常作为json字符串发送 public MyResponse GetData(MyRequest request) { MyResponse response = new MyResponse(); try { // do something } catch(Exception ex) { response.s

我正在从事WCF REST项目。在WCF/服务器端,每当catch块中发生异常时,我都会执行下面的操作,并在响应客户端时将异常作为json字符串发送

public MyResponse GetData(MyRequest request)
{
   MyResponse response = new MyResponse();
   try
   {
       // do something
   }
   catch(Exception ex)
   { 
      response.success = false;
      response.ExceptionJSONString = Newtonsoft.Json.JsonConvert.SerializeObject(ex);
   }
   return response;
}
请看下面我的客户端

我的问题是有一种方法可以反序列化异常对象。我觉得您不能这样做,因为异常类继承了ISerializable。但我只是想问问周围,看看有没有人这么做

更新:我能够从客户机到服务器获得准确的异常对象,如下所示

[DataContract]
public class MyResponse 
{
   [DataMember]
   public bool Success { get; set; }

   [DataMember]
   public MyExceptionJson ExceptionDataAsJson { get; set; }
}
在DataContract类下面创建

[DataContract]
public class MyExceptionJson
{
   [DataMember]
   public string JsonData { get; set; }

   [DataMember]
   public string AssemblyName { get; set; }

   [DataMember]
   public string TypeName { get; set; }

   public MyExceptionJson()
   {
      JsonData = string.Empty;
      AssemblyName = string.Empty;
      TypeName = string.Empty;
   }

   public MyExceptionJson(Exception exception)
   {
      JsonData = Newtonsoft.Json.JsonConvert.SerializeObject(exception);
      Type type = exception.GetType();
      AssemblyName = type.Assembly.GetName().Name;
      TypeName = type.FullName;
   }

    public Exception ToException()
    {
       if (string.IsNullOrEmpty(JsonData) == true ||
           string.IsNullOrEmpty(AssemblyName) == true ||
           string.IsNullOrEmpty(TypeName) == true)
         {
            return new Exception();
         }

       Type type = null;
      foreach (Assembly item in System.AppDomain.CurrentDomain.GetAssemblies())
      {
         AssemblyName assemblyName = item.GetName();
          if (assemblyName != null &&
              string.IsNullOrEmpty(assemblyName.Name) == false &&
              assemblyName.Name == AssemblyName)
            {
               type = item.GetType(TypeName);
               if (type != null)
                   break;
             }
        }
        //fail safe code
        if (type == null)
        {
           type = typeof(Exception);
        }
     object returnException = Newtonsoft.Json.JsonConvert.DeserializeObject(JsonData, type);
     return returnException as Exception;
     }
}
在我的响应类中添加了此类类型的属性,如下所示

[DataContract]
public class MyResponse 
{
   [DataMember]
   public bool Success { get; set; }

   [DataMember]
   public MyExceptionJson ExceptionDataAsJson { get; set; }
}
服务器:当异常发生时

  MyResponse response = new MyResponse()
  {
     Success = false,
     ExceptionDataAsJson = null
  };

  try 
  {
     //code 
  }
  catch(Exception ex)
  {
      response.ExceptionDataAsJson = new MyExceptionJson(ex);
  }
  return response;
客户:当你得到回复的时候

 if (response != null && response.Success == false)
 {
  Exception ex = null;
  //something went wrong                    
  if (response.ExceptionDataAsJson != null)
  {
    ex = response.ExceptionDataAsJson.ToException();                        
  }
 }
您可以只使用Newtonsoft.Json.JsonConvert.DeserializeObject 因此,请将代码更改为:

Exception ex = Newtonsoft.Json.JsonConvert.DeserializeObject<Exception>(upResponse.ExceptionJSONString);

为什么ISerializable会排除反序列化选项?没有反序列化,序列化的任何东西都只是一堆二进制或字符垃圾。@Ryan。。在使用WCF服务的代码中,我能够将exceptionjson字符串发送到客户端,但在我的小提琴中,它甚至在序列化时抛出错误。看看有什么不对劲fiddle@Ryan.. 你的工作。。这就是答案。。。请回答这篇文章。。我会接受的。。Thanks@Ziggler根据您的请求作为答复发布。@RyanWilson。。谢谢我接受了…Ryan…我们正在努力在项目中改进此解决方案。。我们不希望总是反序列化到异常,而是希望反序列化到从WCF/服务器端接收到的确切异常类型。。。我正在调查。。。任何建议…@Ziggler所有异常都继承自异常,因此我认为您可以将其转换为特定的异常类型。但从我的WCF/服务器端,我得到json字符串中的异常。。。我觉得我需要以某种方式将异常类型传递给客户端,然后反序列化为该类型。。但这种方法需要检查来自的每个异常类型server@Ziggler即使您向json中添加了确切类型的异常,您也必须执行if-else-if或switch来决定反序列化到哪种类型,因此无论哪种方式,您都必须在接收响应时执行类型检查。Ryan。。是的,我也同意我需要使用条件运算符。。这就是我想要避免的。。。