当尝试反序列化从Exception继承的类时,Json.net失败
本文关键字:Json 失败 net 继承 反序列化 Exception | 更新日期: 2023-09-27 17:50:54
我有一个继承自Exception
的类SearchError
,当我试图从有效的json中反序列化它时,我得到以下异常:
可序列化类型'SearchError'没有有效的构造函数。要正确实现isserializable,应该提供一个接受SerializationInfo和StreamingContext参数的构造函数。路径",第一行,位置81.
我尝试实现建议的缺失构造函数,但没有帮助。
这是实现建议的构造函数后的类:
public class APIError : Exception
{
[JsonProperty("error")]
public string Error { get; set; }
[JsonProperty("@http_status_code")]
public int HttpStatusCode { get; set; }
[JsonProperty("warnings")]
public List<string> Warnings { get; set; }
public APIError(string error, int httpStatusCode, List<string> warnings) : base(error)
{
this.Error = error;
this.HttpStatusCode = httpStatusCode;
this.Warnings = warnings;
}
public APIError(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
: base(info, context)
{
Error = (string)info.GetValue("error", typeof(string));
HttpStatusCode = (int)info.GetValue("@http_status_code", typeof(int));
Warnings = (List<string>)info.GetValue("warnings", typeof(List<string>));
}
}
现在我得到以下异常(也在json.net代码):
成员'ClassName'未找到。
我也试着执行与此相关问题相同的解决方案,也得到了相同的错误。
这个问题已经在这里得到了解答:https://stackoverflow.com/a/3423037/504836
添加新的构造函数
public Error(SerializationInfo info, StreamingContext context){}
解决了我的问题。
完整代码:
[Serializable]
public class Error : Exception
{
public string ErrorMessage { get; set; }
public Error(SerializationInfo info, StreamingContext context) {
if (info != null)
this.ErrorMessage = info.GetString("ErrorMessage");
}
public override void GetObjectData(SerializationInfo info,StreamingContext context)
{
base.GetObjectData(info, context);
if (info != null)
info.AddValue("ErrorMessage", this.ErrorMessage);
}
}
如错误提示所示,您缺少序列化构造函数:
public class SearchError : Exception
{
public SearchError(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context)
{
}
}