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

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

[Serializable] public class Error : Exception, ISerializable { public string ErrorMessage { get; set; } public Error() { } } 

Error error = JsonConvert.DeserializeObject("json error obj string");

它给了我错误:

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

添加新构造函数

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

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

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

(学分去这个图书馆)

添加已经提供的好答案;

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

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

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