Как десериализовать объект, полученный из класса Exception, используя Json.net(С#)?
Я пытаюсь десериализовать объект, полученный из класса Exception:
[Serializable]
public class Error : Exception, ISerializable
{
public string ErrorMessage { get; set; }
public Error() { }
}
Error error = JsonConvert.DeserializeObject< Error >("json error obj string");
Это дает мне ошибку:
Тип ISerializable типа не имеет допустимого конструктора.
Ответы
Ответ 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);
}
}
Ответ 2
В качестве альтернативы вы можете выбрать стратегию OptIn и определить свойства, которые необходимо обработать. В случае вашего примера:
[JsonObject(MemberSerialization.OptIn)]
public class Error : Exception, ISerializable
{
[JsonProperty(PropertyName = "error")]
public string ErrorMessage { get; set; }
[JsonConstructor]
public Error() { }
}
(Кредиты переходят в эту библиотеку)
Ответ 3
Добавление уже предоставленных хороших ответов;
Если исключение исходит из приложения на основе Java, то выше коды будут терпеть неудачу.
Для этого, sth. как показано ниже, может быть сделано в конструкторе;
public Error(SerializationInfo info, StreamingContext context)
{
if (info != null)
{
try
{
this.ErrorMessage = info.GetString("ErrorMessage");
}
catch (Exception e) {
**this.ErrorMessage = info.GetString("message");**
}
}
}