C# 有没有反序列化异常对象的方法?
我正在从事WCF REST项目。在WCF/服务器端,每当catch块中发生异常时,我都会执行下面的操作,并在响应客户端时将异常作为json字符串发送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
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。。是的,我也同意我需要使用条件运算符。。这就是我想要避免的。。。