Как десериализовать объект, полученный из класса 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 тип 'type' не имеет допустимого конструктора.


person Piotr    schedule 06.08.2010    source источник
comment
Во-первых, это не лучший способ расширить класс Exception.   -  person thelost    schedule 06.08.2010
comment
Я удивлен, что это даже компилируется, поскольку вы на самом деле не реализовали интерфейс ISerializable.   -  person Ronald Wildenberg    schedule 06.08.2010
comment
ISerializable определен в классе Exception   -  person Kikaimaru    schedule 06.08.2010


Ответы (3)


Добавление нового конструктора

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);
    }
}
person Piotr    schedule 06.08.2010
comment
Вы не должны проверять info на null, это гарантирует, что он не равен нулю :) - person Alex Zhukovskiy; 23.06.2016

В качестве альтернативы вы можете выбрать стратегию OptIn и определить свойства, которые должны быть обработаны. В случае вашего примера:

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

    [JsonConstructor]
    public Error() { }
}

(Спасибо за использование этой библиотеки)

person Martijn    schedule 07.08.2014

Добавление к уже предоставленным хорошим ответам;

Если исключение исходит из приложения на основе Java, то приведенные выше коды не сработают.

Для этого ст. как показано ниже, можно сделать в конструкторе;

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