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}");