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