Как десериализовать объект, полученный из класса 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");**
                }
            }

        }