【发布时间】:2020-07-20 22:07:23
【问题描述】:
考虑以下非常简单的代码。
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}");
瞧……内部异常类型是Exception,而不是NullReferenceException。
所以我搜索了 SO 并找到了很多用于反序列化的自定义 JsonConverter 示例(因为序列化的 JSON 包含 ClassName 属性,可用于创建特定类型)。所以我写了一个(为简单起见,仅出现ReadJson,其余照常)。
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var json_object = Newtonsoft.Json.Linq.JObject.Load(reader);
var target_type_name = json_object.Value<string>("ClassName");
var target_type = Type.GetType(target_type_name);
var target = Activator.CreateInstance(target_type);
serializer.Populate(json_object.CreateReader(), target);
return target;
}
并在调用上述DeserializeObject 函数时传递此转换器。
这一次,我得到了异常:
Newtonsoft.Json.JsonSerializationException:无法将 JSON 对象填充到类型“System.Exception”上。路径“类名”
据我研究 Newtonsoft.Json 代码,似乎“问题”是 Exception 是 [Serializable] 和 ISerializable 所以它使用不支持填充对象的 SerializableContract。但是在这里我以绝望告终:-(。有人可以帮助我吗?
(上面的例子只是为了简单起见,我需要对自己的异常进行序列化和反序列化,这些异常要复杂得多。使用的是Newtonsoft.Json 11.0.0.2版本。)
【问题讨论】:
标签: c# json.net json-deserialization