Не ответ на ваш вопрос, но это сработает
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})
Что я сделал, прежде, создают пользовательский Ошибочный класс. Это инкапсулирует всю релевантную информацию об Исключении и 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;
}
}
Создайте пользовательский Класс исключений с [сериализуемый ()] атрибут. Вот пример, взятый от 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) { }
}
Класс исключений отмечен как сериализуемый и реализует ISerializable. См. MSDN: http://msdn.microsoft.com/en-us/library/system.exception.aspx
, При попытке сериализировать к XML использование эти XmlSerializer
, Вы поразите ошибку в любых участников та реализация IDictionary
. Это - ограничение XmlSerializer, но класс является, конечно, сериализуемым.
При попытке сериализировать исключение для журнала, могло бы быть лучше сделать.ToString () и затем сериализировать это к Вашему журналу.
, Но вот статья о том, как сделать это, и почему. В основном необходимо реализовать ISerializable на исключении. Если это - системное исключение, я полагаю, что им реализовали тот интерфейс. Если это - чужое исключение, Вы смогли разделять его на подклассы для реализации интерфейса ISerializable.
Я не уверен, почему Вы хотели бы сериализировать исключение...
, Если я действительно хотел сделать то, что Вы указываете, я создал бы пользовательский Класс исключений, который реализует ISerializable. Можно принять решение сделать это ребенком Исключения, или у Вас мог быть он быть абсолютно пользовательским классом, который только имеет и делает то, в чем Вы нуждаетесь.
Создайте конструктор protected
, подобный этому (также вы должны отметить свой Exception
class [Serializable]
):
protected MyException(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context):base(info,context)
{
}
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
}