2016-04-27 15 views
1

У меня есть собственный объект сообщения журнала, который я пытаюсь сериализовать с помощью формата Jil to JSON. Это первый раз, когда я использовал Jil вместо стандартного сериализатора JSON.Net, поэтому я не очень хорошо знаком с ним.Jil Serializer Method может быть вызван только для типа, для которого Type.IsGenericParameter является истинным

Одним из свойств объекта сообщения журнала является Исключение. Когда свойство Exception равно null, Jil сериализует объект без проблем. Однако, если объект Exception заполнен фактическим исключением, я получаю сообщение об ошибке Jil of Type System.InvalidOperationException.

Сообщение: Метод может быть вызван только для типа, для которого Type.IsGenericParameter является истинным.

StackTrace: в System.RuntimeType.get_GenericParameterPosition() в _DynamicMethod43 (TextWriter, RuntimeType, Int32) в Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically (MemberInfo dynamicMember, TextWriter потока, объект Вал, параметры выбирает, Int32 глубина) в C: \ Users \ kevin_000 \ Dropbox \ Jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: линия 237 в Jil.SerializeDynamic.DynamicSerializer.SerializeInternal (MemberInfo dynamicMember, TextWriter поток, OBJ объекта, параметры OPTS, Int32 глубина) в c: \ Users \ kevin_000 \ Dropbox \ jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: строка 836 в Jil.SerializeDynamic.DynamicSerializer.Serialize (TextWriter поток, OBJ объект, параметры выбирает, Int32 глубина) в C: \ Users \ kevin_000 \ Dropbox \ Jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: линия 746 в _DynamicMethod40 (TextWriter, RuntimeMethodInfo, Int32)
на Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically (MemberInfo dynamicMember, TextWriter поток, объект ВАЛ, параметры выбирает, Int32 глубины) в C: \ Users \ kevin_000 \ Dropbox \ Jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: строка 237 at Jil.SerializeDynamic.DynamicSerializer.SerializeInternal (MemberInfo dynamicMember, TextWriter strea м, OBJ объект, параметры выбирает, Int32 глубины) в C: \ Users \ kevin_000 \ Dropbox \ Jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: линия 836 в Jil.SerializeDynamic.DynamicSerializer.Serialize (TextWriter поток, Object OBJ, параметры выбирает, глубина Int32) в C: \ Users \ kevin_000 \ Dropbox \ Jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: линия 746 на _DynamicMethod23 (TextWriter, OperationCanceledException, Int32) в Jil.SerializeDynamic.DynamicSerializer. SerializeSemiStatically (MemberInfo dynamicMember, TextWriter stream, Object val, Options opts, Int32 depth) в c: \ Users \ kevin_000 \ Dropbox \ jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: строка 237 в Jil.SerializeDynamic.DynamicSerializer.SerializeInternal (MemberInfo dynamicMember, TextWriter поток, OBJ объекта, параметры OPTS, Int32 глубина) в C: \ Users \ kevin_000 \ Dropbox \ Jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: линия 836 в Jil.SerializeDynamic.DynamicSerializer.Serialize (TextWriter поток, OBJ объект, параметры выбирает, Int32 глубина) в C: \ Users \ kevin_000 \ Dropbox \ Jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: линия 746 в _DynamicMethod4 (TextWriter, LogMessage, Int32) в Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically (MemberInfo dynamicMember, TextWriter поток, объект знач, параметры выбирает, Int32 глубины) в C: \ Users \ kevin_000 \ Dropbox \ Jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: линия 237 в Jil.SerializeDynamic.DynamicSerializer .SerializeInternal (MemberInfo dynamicMember, TextWriter поток, OBJ объект, параметры выбирает, Int32 глубины) в C: \ Users \ kevin_000 \ Dropbox \ Jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: линия 836 в Jil.SerializeDynamic.DynamicSerializer .Serialize (TextWriter stream, Object obj, Options opts, Int32 depth) в c: \ Users \ kevin_000 \ Dropbox \ jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: строка 746 в Jil.JSON.SerializeDynamic (данные объекта, вывод TextWriter, Опции) в c: \ Users \ kevin_000 \ Dropbox \ jil \ Jil \ JSON.cs: строка 64 в Jil.JSON.SerializeDynamic (данные объекта, параметры Опции) в c: \ Users \ kevin_000 \ Dropbox \ jil \ Jil \ JSON.cs: строка 84 в Jil.JSON.Serialize [T] (данные T, опции) в c: \ Users \ kevin_000 \ Dropbox \ jil \ Jil \ JSON.cs: строка 4584 на StackExchange.Redis.Extensions.Jil.JilSerializer.Serialize (объект вещь) на StackExchange.Redis.Extensions.Jil.JilSerializer. <> c__DisplayClass4_0.b__0() в System.Threading.Tasks.Task`1.InnerInvoke() в System.Threading.Tasks.Task.Execute()

Я использую следующие варианты Jil Serialization:

new Jil.Options(false, true, false, DateTimeFormat.ISO8601, true, UnspecifiedDateTimeKindBehavior.IsUTC, SerializationNameFormat.CamelCase); 

метод я использую для вызова Jil является:

public byte[] Serialize(object item) 
{ 
    var jsonString = JSON.Serialize(item); 
    return encoding.GetBytes(jsonString); 
} 

полный объект, который я пытаюсь сериализации является:

public class LogMessage 
{ 
public LogMessage() 
{ 
    CreatedDate = DateTime.UtcNow; 
} 

public LogLevel LogLevel { get; set; } 
public string Message { get; set; } 
public DateTime CreatedDate { get; private set; } 
public string AccessToken { get; set; } 
public long? ParticipantId { get; set; } 
public string UserName { get; set; } 
public bool IsAuthenticated { get; set; } 
public string Url { get; set; } 
public Exception Exception { get; set; } 
public string StackTrace { get; set; } 
public string Details { get; set; } 
public string ClientIpAddress { get; set; } 
public string EntryApplication { get; set; } 
public string AuthenticationMethod { get; set; } 
public string AuthenticationClientId { get; set; } 
public string LoggingApplication { get; set; } 

[Description("This is the combination of ClassName - MethodeName")] 
public string MethodName { get; set; } 
public Dictionary<string, string[]> Headers { get; set; } 
public string HttpVerb { get; set; } 
public string TransactionId { get; set; } 
public int? HttpResponseStatusCode { get; set; } 
} 

Любая помощь в решении этой проблемы была бы весьма признательна. Что мне нужно сделать, чтобы сериализовать объект Exception с Jil?

+0

Я использую версию 2.12.1 пакета Jil nuget. – jkruer01

+1

Что такое определение типа 'LogLevel'? Кроме того, что такое Exception, установленное (то есть тип исключения)? –

+0

LogLevel - это перечисление. Я знаю, что это произошло при исключении NullReferenceException, и это также произошло в InvalidOperationException.Я не уверен, произошло ли это при любом другом исключении. – jkruer01

ответ

2

Основная проблема заключается в том, что System.Exception не предназначен для сериализации. Он содержит всевозможную информацию «может работать только на этой машине».

Обычно Jil будет игнорировать много, но ваш Options говорит его includeInherited что означает, что становится Ахольдом всего, что это общественный на System.Exception. Сюда относятся такие вещи, как System.RuntimeTypeHandle и System.RuntimeType.

Jil не должен взорваться таким бесполезным способом (я делаю заметку, чтобы разобраться, как обнаружить эти случаи и лучше сообщить об этом), но эти типы не могут быть сериализованы или десериализованы разумно , Я бы посоветовал копировать те части Exception, о которых вы заботитесь, в saner POCO.

Вы, вероятно, также как способ вызвать SerializeDynamic или сделать Serialize родовое - лечит Jil в Serialize(object) в основном эквивалентный SerializeDynamic, мог бы также быть явным.

+0

Спасибо, Кевин, я очень ценю это и спасибо за всю работу, которую вы сделали в Джиле! – jkruer01