16

我有一个SearchError继承自的类,Exception当我尝试从有效的 json 反序列化它时,我得到以下异常:

ISerializable 类型“SearchError”没有有效的构造函数。要正确实现 ISerializable,应该存在采用 SerializationInfo 和 StreamingContext 参数的构造函数。路径 '',第 1 行,位置 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 代码中):

未找到成员“类名”。

我也尝试实现与这个相关问题相同的解决方案,也得到了上面相同的错误。

4

2 回答 2

15

这个问题在这里得到了回答: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);
    }
}
于 2013-08-13T02:28:11.127 回答
5

正如错误所说,您缺少序列化构造函数:

public class SearchError : Exception
{
    public SearchError(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context)
    {

    }
}
于 2013-01-06T19:55:35.747 回答