如何使用Json.net(C#)反序列化从Exception类派生的对象?

时间:2010-08-06 09:59:04

标签: c# json.net serialization

我正在尝试反序列化从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'没有有效的构造函数。

3 个答案:

答案 0 :(得分:17)

添加新的构造函数

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

答案 1 :(得分:7)

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

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

    [JsonConstructor]
    public Error() { }
}

(积分转到this图书馆)

答案 2 :(得分:0)

添加已经提供的好答案;

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

为此,某事。如下所示可以在构造函数中完成;

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

        }