16

我正在尝试反序列化从 Exception 类派生的对象:

[Serializable]
public class Error : Exception, ISerializable
{
    public string ErrorMessage { get; set; }
    public Error() { }
}
Error error = JsonConvert.DeserializeObject< Error >("json error obj string"); 

它给了我错误:

ISerializable 类型 'type' 没有有效的构造函数。

4

3 回答 3

19

添加新的构造函数

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);
    }
}
于 2010-08-06T10:47:58.600 回答
7

或者,您可以选择 OptIn 策略并定义应处理的属性。在你的例子的情况下:

[JsonObject(MemberSerialization.OptIn)]
public class Error : Exception, ISerializable
{
    [JsonProperty(PropertyName = "error")]
    public string ErrorMessage { get; set; }

    [JsonConstructor]
    public Error() { }
}

(学分去这个图书馆)

于 2014-08-07T13:30:47.360 回答
2

添加已经提供的很好的答案;

如果异常来自基于 java 的应用程序,则上述代码将失败。

为此,…… 像下面这样可以在构造函数中完成;

public Error(SerializationInfo info, StreamingContext context)
{
    if (info != null)
    {
        try
        {
            this.ErrorMessage = info.GetString("ErrorMessage");
        }
        catch (Exception e) 
        {
            **this.ErrorMessage = info.GetString("message");**
        }
    }
}
于 2017-06-28T14:44:31.807 回答