【问题标题】:How to deserialize object derived from Exception class using Json.net?如何使用 Json.net 反序列化从 Exception 类派生的对象?
【发布时间】:2010-08-06 09:59:03
【问题描述】:

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

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

它给了我错误:

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

【问题讨论】:

  • 首先,这不是扩展Exception 类的最佳方式。
  • 我很惊讶这甚至可以编译,因为您实际上还没有实现 ISerializable 接口。
  • ISerializable 定义在 Exception 类上

标签: c# json.net serialization


【解决方案1】:

添加一个新的构造函数

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

【讨论】:

  • 你不应该检查info是否为空,它保证不为空:)
【解决方案2】:

或者,您可以选择 OptIn 策略并定义应处理的属性。以您为例:

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

    [JsonConstructor]
    public Error() { }
}

(学分转到this图书馆)

【讨论】:

    【解决方案3】:

    添加已经提供好的答案;

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

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

    public Error(SerializationInfo info, StreamingContext context)
    {
        if (info != null)
        {
            try
            {
                this.ErrorMessage = info.GetString("ErrorMessage");
            }
            catch (Exception e) 
            {
                **this.ErrorMessage = info.GetString("message");**
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多