1

我有一个自定义日志消息对象,我正在尝试使用 Jil 将其序列化为 JSON 格式。这是我第一次使用 Jil 而不是默认的 JSON.Net 序列化程序,所以我不是很熟悉。

日志消息对象的属性之一是异常。当 Exception 属性为 null 时,Jil 会毫无问题地序列化对象。但是,如果 Exception 对象填充了实际的异常,我会从 Jil 收到 System.InvalidOperationException 类型的错误。

消息:只能在 Type.IsGenericParameter 为 true 的类型上调用方法。

StackTrace:在 System.RuntimeType.get_GenericParameterPosition() at _DynamicMethod43(TextWriter , RuntimeType , Int32 ) at Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically(MemberInfo dynamicMember, TextWriter stream, Object val, Options opts, Int32 depth) in c:\Users\kevin_000 \Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs:Jil.SerializeDynamic.DynamicSerializer.SerializeInternal(MemberInfo dynamicMember, TextWriter 流, Object obj, Options opts, Int32 depth) in c:\Users\kevin_000\Dropbox\jil 的第 237 行\Jil\SerializeDynamic\DynamicSerializer.cs:第 836 行,位于 C:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer 中的 Jil.SerializeDynamic.DynamicSerializer.Serialize(TextWriter 流,对象 obj,选项选项,Int32 深度)。 cs:_DynamicMethod40(TextWriter 处的第 746 行,运行时方法信息 , Int32 )
在 C:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs:Jil.SerializeDynamic 中的 Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically(MemberInfo dynamicMember, TextWriter 流, Object val, Options opts, Int32 depth) .DynamicSerializer.SerializeInternal(MemberInfo dynamicMember, TextWriter 流, Object obj, Options opts, Int32 depth) in c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs:line 836 at Jil.SerializeDynamic.DynamicSerializer.Serialize (TextWriter 流,对象 obj,Options opts,Int32 深度)在 C:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs:line 746 at _DynamicMethod23(TextWriter , OperationCanceledException , Int32 ) at Jil.SerializeDynamic.DynamicSerializer .在 c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs:Jil.SerializeDynamic.DynamicSerializer.SerializeInternal(MemberInfo dynamicMember ,TextWriter 流,对象 obj,选项 opts,Int32 深度)在 c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs:Jil.SerializeDynamic.DynamicSerializer.Serialize 的第 836 行(TextWriter 流,对象 obj,选项 opts, Int32 depth) in c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs:line 746 at _DynamicMethod4(TextWriter , LogMessage , Int32 ) at Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically(MemberInfo dynamicMember, TextWriter流,对象验证,选项选项,Int32 深度)在 c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs:line 237 at Jil.SerializeDynamic.DynamicSerializer.SerializeInternal(MemberInfo dynamicMember, TextWriter stream, Object obj, Options opts, Int32 depth) in c:\Users\kevin_000\Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs: 第 836 行 Jil.SerializeDynamic.DynamicSerializer.Serialize(TextWriter 流, Object obj, Options opts, Int32 depth) in c:\Users\kevin_000\ Dropbox\jil\Jil\SerializeDynamic\DynamicSerializer.cs:Jil.JSON.SerializeDynamic(对象数据,TextWriter 输出,选项选项)中的第 746 行:\Users\kevin_000\Dropbox\jil\Jil\JSON.cs:第 64 行在 C:\Users\kevin_000\Dropbox\jil\Jil\JSON.cs 中的 Jil.JSON.SerializeDynamic(对象数据,选项选项):Jil.JSON.Serialize[T] 的第 84 行(T 数据,选项选项)在 c:\Users\kevin_000\Dropbox\jil\Jil\JSON.cs:line 4584 at StackExchange.Redis.Extensions.Jil.JilSerializer.Serialize(Object item) at 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; }
}

任何解决此问题的帮助将不胜感激。为了用 Jil 序列化 Exception 对象,我需要做什么?

4

1 回答 1

4

这里的根本问题是它System.Exception不应该被序列化。它包含各种“只能在这台机器上工作”的信息。

通常 Jil 会忽略其中的很多内容,但您Options告诉它includeInherited这意味着它正在获取所有公开的内容System.Exception。这包括诸如System.RuntimeTypeHandle和之类的东西System.RuntimeType

Jil 不应该以这种无益的方式爆炸(我正在记下如何检测这些情况并更好地报告它们),但是这些类型不能被序列化或反序列化。我建议将您关心的异常部分复制到一个更健全的 POCO 上。

您可能也可以调用SerializeDynamic或制作Serialize通用的方式 - Jil 的处理Serialize(object)大多等同于SerializeDynamic, 也可能是明确的。

于 2016-04-28T20:36:17.090 回答