Как сериализировать Объект исключения в C#?

Не ответ на ваш вопрос, но это сработает

var filteredDataOpt: [TimeSeriesEntry?] = filteredApps
        .map { data in
            let isInDate = dates.contains { date in
                guard let d = date else {
                    return false
                }
                return Calendar.current.isDate(d, equalTo: data.date, toGranularity: Calendar.Component.day)
            }
            return isInDate ? timeSeriesDataFromAppData(data) : nil
        }
filteredDataOpt.append(contentsOf: locationsData.map { data in
            let isInDate = dates.contains { date in
                guard let d = date else {
                    return false
                }
                return Calendar.current.isDate(d, equalTo: data.date, toGranularity: Calendar.Component.day)
            }
            return isInDate ? timeSeriesDataFromLocationData(data) : nil})
71
задан Wai Ha Lee 8 January 2016 в 15:29
поделиться

7 ответов

Что я сделал, прежде, создают пользовательский Ошибочный класс. Это инкапсулирует всю релевантную информацию об Исключении и XML сериализуемый.

[Serializable]
public class Error
{
    public DateTime TimeStamp { get; set; }
    public string Message { get; set; }
    public string StackTrace { get; set; }

    public Error()
    {
        this.TimeStamp = DateTime.Now;
    }

    public Error(string Message) : this()
    {
        this.Message = Message;
    }

    public Error(System.Exception ex) : this(ex.Message)
    {
        this.StackTrace = ex.StackTrace;
    }

    public override string ToString()
    {
        return this.Message + this.StackTrace;
    }
}
39
ответ дан davogones 24 November 2019 в 12:57
поделиться

Создайте пользовательский Класс исключений с [сериализуемый ()] атрибут. Вот пример, взятый от MSDN:

[Serializable()]
public class InvalidDepartmentException : System.Exception
{
    public InvalidDepartmentException() { }
    public InvalidDepartmentException(string message) : base(message) { }
    public InvalidDepartmentException(string message, System.Exception inner) : base(message, inner) { }

    // Constructor needed for serialization 
    // when exception propagates from a remoting server to the client.
    protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo info,
        System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}
48
ответ дан ludicrousmind 24 November 2019 в 12:57
поделиться

Класс исключений отмечен как сериализуемый и реализует ISerializable. См. MSDN: http://msdn.microsoft.com/en-us/library/system.exception.aspx

, При попытке сериализировать к XML использование эти XmlSerializer, Вы поразите ошибку в любых участников та реализация IDictionary. Это - ограничение XmlSerializer, но класс является, конечно, сериализуемым.

38
ответ дан LCJ 24 November 2019 в 12:57
поделиться

При попытке сериализировать исключение для журнала, могло бы быть лучше сделать.ToString () и затем сериализировать это к Вашему журналу.

, Но вот статья о том, как сделать это, и почему. В основном необходимо реализовать ISerializable на исключении. Если это - системное исключение, я полагаю, что им реализовали тот интерфейс. Если это - чужое исключение, Вы смогли разделять его на подклассы для реализации интерфейса ISerializable.

9
ответ дан mmr 24 November 2019 в 12:57
поделиться

Я не уверен, почему Вы хотели бы сериализировать исключение...

, Если я действительно хотел сделать то, что Вы указываете, я создал бы пользовательский Класс исключений, который реализует ISerializable. Можно принять решение сделать это ребенком Исключения, или у Вас мог быть он быть абсолютно пользовательским классом, который только имеет и делает то, в чем Вы нуждаетесь.

1
ответ дан mson 24 November 2019 в 12:57
поделиться

Создайте конструктор protected , подобный этому (также вы должны отметить свой Exception class [Serializable] ):

protected MyException(System.Runtime.Serialization.SerializationInfo info,
    System.Runtime.Serialization.StreamingContext context):base(info,context)
{
}
5
ответ дан 24 November 2019 в 12:57
поделиться

mson писал: "Я не уверен, почему вы хотите сериализовать исключение..."

Я сериализую исключения, чтобы передать исключение через веб-сервис вызывающему объекту, который может десериализовать, затем перебросить, записать в журнал или как-то иначе обработать его.

Я сделал вот что. Я просто создал класс-обертку Serializable, который заменил IDictionary на сериализуемую альтернативу (массив KeyValuePair)

/// <summary>
/// A wrapper class for serializing exceptions.
/// </summary>
[Serializable] [DesignerCategory( "code" )] [XmlType( AnonymousType = true, Namespace = "http://something" )] [XmlRootAttribute( Namespace = "http://something", IsNullable = false )] public class SerializableException
{
    #region Members
    private KeyValuePair<object, object>[] _Data; //This is the reason this class exists. Turning an IDictionary into a serializable object
    private string _HelpLink = string.Empty;
    private SerializableException _InnerException;
    private string _Message = string.Empty;
    private string _Source = string.Empty;
    private string _StackTrace = string.Empty;
    #endregion

    #region Constructors
    public SerializableException()
    {
    }

    public SerializableException( Exception exception ) : this()
    {
        setValues( exception );
    }
    #endregion

    #region Properties
    public string HelpLink { get { return _HelpLink; } set { _HelpLink = value; } }
    public string Message { get { return _Message; } set { _Message = value; } }
    public string Source { get { return _Source; } set { _Source = value; } }
    public string StackTrace { get { return _StackTrace; } set { _StackTrace = value; } }
    public SerializableException InnerException { get { return _InnerException; } set { _InnerException = value; } } // Allow null to be returned, so serialization doesn't cascade until an out of memory exception occurs
    public KeyValuePair<object, object>[] Data { get { return _Data ?? new KeyValuePair<object, object>[0]; } set { _Data = value; } }
    #endregion

    #region Private Methods
    private void setValues( Exception exception )
    {
        if ( null != exception )
        {
            _HelpLink = exception.HelpLink ?? string.Empty;
            _Message = exception.Message ?? string.Empty;
            _Source = exception.Source ?? string.Empty;
            _StackTrace = exception.StackTrace ?? string.Empty;
            setData( exception.Data );
            _InnerException = new SerializableException( exception.InnerException );
        }
    }

    private void setData( ICollection collection )
    {
        _Data = new KeyValuePair<object, object>[0];

        if ( null != collection )
            collection.CopyTo( _Data, 0 );
    }
    #endregion
}
17
ответ дан 24 November 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: