Метод сериализатора Jil может быть вызван только для типа, для которого Type.IsGenericParameter имеет значение true.
У меня есть пользовательский объект сообщения журнала, который я пытаюсь сериализовать с Jil в формат JSON. Я впервые использую Jil вместо стандартного сериализатора JSON.Net, поэтому я не очень знаком с ним.
Одним из свойств объекта сообщения журнала является исключение. Когда свойство Exception равно null, Jil сериализует объект без проблем. Однако, если объект Exception заполнен фактическим исключением, я получаю ошибку от Jil типа System.InvalidOperationException.
Сообщение: метод может быть вызван только для типа, для которого Type.IsGenericParameter имеет значение true.
StackTrace: в System.RuntimeType.get_GenericParameterPosition() в _DynamicMethod43(TextWriter, RuntimeType, Int32) в Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically(член MemberInfo dynamicMember, глубина_интаксиса_опользователей_процедуры, поток TextWriter \ In_32, глубина_пользователя_перечисления в потоке объекта: CAL) \ Dropbox \ jil \ Jil \ SerializeDynamic \ DynamicSerializer.cs: строка 237 в Jil.SerializeDynamic.DynamicSerializer.SerializeInternal(MemberInfo dynamicMember, поток TextWriter, объектный объект, параметры выбора, глубина Int32) в c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs: строка 836 в Jil.SerializeDynamic.DynamicSerializer.Serialize(поток TextWriter, объект obj, параметры opts, глубина Int32) в c: \ Users \ kevin_000 \ Dropbox \ jil \ Jil \ SerializeDynamic \ DynamicSerializer. cs: строка 746 в _DynamicMethod40 (TextWriter, RuntimeMethodInfo, Int32)
в Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically(MemberInfo dynamicMember, поток TextWriter, объект Val, параметры, опции, глубина Int32) в c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs: строка 237 в Jilic.Serial.DynamicSerializer.SerializeInternal (MemberInfo dynamicMember, поток TextWriter, объектный объект, параметры выбора, глубина Int32) в c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs: строка 836 в Jil.SerializeDynamic.DynamicSerializer. (Поток TextWriter, Object obj, Опции опций, глубина Int32) в c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs: строка 746 в _DynamicMethod23(TextWriter, OperationCanceledException, Int32) в Jil.SerializeDynamic.DicicSynamS.SerializeSemiStatically (MemberInfo dynamicMember, поток TextWriter, Object val, Опции параметров, глубина Int32) в c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs: строка 237 в Jil.SerializeDynamic.DynamicSeria lizer.SerializeInternal (MemberInfo dynamicMember, поток TextWriter, Object 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 в _DynamicMethod4 (TextWriter, LogMessage, Int32) в Jil.SerializeDynamic.DynamicSerial. SerializeSemiStatically (MemberInfo dynamicMember, поток TextWriter, Object val, Опции параметров, глубина Int32) в c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs: строка 237 в Jil.SerializeDynamic.DynamicMerializer.SerializeIneer Member (, Поток TextWriter, объект obj, параметры, глубина 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 в 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. Сериализуйте [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:
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?
1 ответ
Основная проблема здесь заключается в том, что System.Exception
не предназначен для сериализации. Он содержит всевозможную информацию "может работать только на этом компьютере".
Обычно Джил игнорирует многое из этого, но ваш Options
говорят это includeInherited
это означает, что он овладевает всем, что публикуется на System.Exception
, Это включает в себя такие вещи, как System.RuntimeTypeHandle
а также System.RuntimeType
,
Джил не должен взрываться таким бесполезным способом (я делаю заметку, чтобы выяснить, как выявлять эти случаи и лучше сообщать о них), но эти типы типов нельзя сериализовать или десериализовать разумно. Я бы посоветовал скопировать части Исключения, которые вас интересуют, в более разумный POCO.
Вы, вероятно, также в любом случае позвонить SerializeDynamic
или сделать Serialize
универсальный - угощения Джила Serialize(object)
в основном эквивалентно SerializeDynamic
также может быть явным.