C# JSON.NET:如何反序列化特定异常类型

C# JSON.NET:如何反序列化特定异常类型,c#,json.net,json-deserialization,C#,Json.net,Json Deserialization,考虑以下非常简单的代码 var ex_to_serialize = new Exception("something wrong", new NullReferenceException("set to null")); var serialized_ex = JsonConvert.SerializeObject(ex_to_serialize); var deserialized_ex = JsonConvert.DeserializeObject&

考虑以下非常简单的代码

var ex_to_serialize = new Exception("something wrong", new NullReferenceException("set to null"));
var serialized_ex = JsonConvert.SerializeObject(ex_to_serialize);

var deserialized_ex = JsonConvert.DeserializeObject<Exception>(serialized_ex);
Console.WriteLine($"Type of inner exception: {deserialized_ex.InnerException.GetType().Name}");
并在调用上面的
反序列化对象
函数时传递此转换器。 这一次,我得到了一个例外:

Newtonsoft.Json.JsonSerializationException:无法将Json对象填充到类型“System.Exception”上。路径“ClassName”

就我深入研究Newtonsoft.Json代码而言,“问题”似乎在于
异常
[Serializable]
可序列化
,因此它使用SerializableContract,它不支持填充对象。但在这里我绝望地结束了:——(.有人能帮我吗


(上面的例子只是为了简单起见,我需要序列化和反序列化我自己的异常,这些异常要复杂得多。使用了Newtonsoft.Json 11.0.0.2版。)

您忘记了字体处理设置。[] 因此,请像下面这样修复代码,它将正常工作

var ex_to_serialize = new Exception("something wrong", new NullReferenceException("set to null"));

var serialized_ex = JsonConvert.SerializeObject(ex_to_serialize,new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.All});

var deserialized_ex = JsonConvert.DeserializeObject<Exception>(serialized_ex, new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.All});

Console.WriteLine($"Type of inner exception: {deserialized_ex.InnerException.GetType().Name}");
var ex_to_serialize=new Exception(“出错”,new NullReferenceException(“设置为null”);
var serialized_ex=JsonConvert.SerializeObject(ex_to_serialize,新的JsonSerializerSettings{typenameholding=typenameholding.All});
var反序列化的_ex=JsonConvert.DeserializeObject(序列化的_ex,新的JsonSerializerSettings{TypeNameHandling=TypeNameHandling.All});
WriteLine($”内部异常的类型:{反序列化的_ex.InnerException.GetType().Name}”);

谢谢。它可以工作。但是……如果我无法更改序列化过程(例如,它发生在不可访问的服务器上),那么我在没有
TypeNameHandling的情况下获得json,会发生什么情况呢?
?有没有办法处理这种行为?我仍然有“ClassName”项在序列化的json中,因此我可以找到目标类型,但我不知道如何将信息传递到反序列化过程。如果您没有任何机会更改您操作的json,那么您所能做的就是编写自定义绑定器或customserializer:)CustomeBinder没有意义,因为它不包含任何上下文,自定义序列化程序呢?你是说定制转换器?这就是我在问题中尝试的。。。
var ex_to_serialize = new Exception("something wrong", new NullReferenceException("set to null"));

var serialized_ex = JsonConvert.SerializeObject(ex_to_serialize,new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.All});

var deserialized_ex = JsonConvert.DeserializeObject<Exception>(serialized_ex, new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.All});

Console.WriteLine($"Type of inner exception: {deserialized_ex.InnerException.GetType().Name}");