我有一个自定义日志消息对象,我试图用Jil格式化为JSON格式。这是我第一次使用Jil而不是默认的JSON.Net序列化器,所以我对它不是很熟悉。
日志消息对象的一个属性是Exception。当Exception属性为null时,Jil序列化对象没有问题。但是,如果Exception对象填充了实际异常,我从类型System.InvalidOperationException的Jil中得到一个错误。
消息:只能在Type.IsGenericParameter为true的Type上调用方法。
StackTrace:在System.RuntimeType.get_GenericParameterPosition()处 _DynamicMethod43(TextWriter,RuntimeType,Int32)在Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically(MemberInfo) dynamicMember,TextWriter stream,Object val,Options opts,Int32 深入) C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 237在 Jil.SerializeDynamic.DynamicSerializer.SerializeInternal(的MemberInfo dynamicMember,TextWriter stream,Object obj,Options opts,Int32 深入) C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 836 at Jil.SerializeDynamic.DynamicSerializer.Serialize(TextWriter stream,Object obj,Options opts,Int32 depth)in C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 746 at _DynamicMethod40(TextWriter,RuntimeMethodInfo,Int32)
在 Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically(的MemberInfo dynamicMember,TextWriter stream,Object val,Options opts,Int32 深入) C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 237在 Jil.SerializeDynamic.DynamicSerializer.SerializeInternal(的MemberInfo dynamicMember,TextWriter stream,Object obj,Options opts,Int32 深入) C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 836 at Jil.SerializeDynamic.DynamicSerializer.Serialize(TextWriter stream,Object obj,Options opts,Int32 depth)in C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 746 at _DynamicMethod23(TextWriter,OperationCanceledException, Int32)at Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically(的MemberInfo dynamicMember,TextWriter stream,Object val,Options opts,Int32 深入) C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 237在 Jil.SerializeDynamic.DynamicSerializer.SerializeInternal(的MemberInfo dynamicMember,TextWriter stream,Object obj,Options opts,Int32 深入) C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 836 at Jil.SerializeDynamic.DynamicSerializer.Serialize(TextWriter stream,Object obj,Options opts,Int32 depth)in C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 746在_DynamicMethod4(TextWriter,LogMessage,Int32)处 Jil.SerializeDynamic.DynamicSerializer.SerializeSemiStatically(的MemberInfo dynamicMember,TextWriter stream,Object val,Options opts,Int32 深入) C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 237在 Jil.SerializeDynamic.DynamicSerializer.SerializeInternal(的MemberInfo dynamicMember,TextWriter stream,Object obj,Options opts,Int32 深入) C:\ Users \用户kevin_000 \收存箱\ JIL \吉尔\ SerializeDynamic \ DynamicSerializer.cs:线 836 at Jil.SerializeDynamic.DynamicSerializer.Serialize(TextWriter stream,Object obj,Options opts,Int32 depth)in C:\ Users \用户kevin_000 \收存箱\ 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行at Jil.JSON.Serialize [T](T数据,选项选项)in 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()at 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对象,我需要做什么?
答案 0 :(得分:2)
这里的根本问题是System.Exception
并不意味着序列化。它包含各种各样的&#34;只能在这台机器上运行&#34;信息。
通常情况下,Jil会忽略很多内容,但是Options
告诉includeInherited
,这意味着它会在System.Exception
上公开所有公开内容}。其中包括System.RuntimeTypeHandle
和System.RuntimeType
等内容。
Jil应该以如此无益的方式爆炸(我正在做一个记录去弄清楚如何检测这些情况并更好地报告它们),但那些类型的人不能这样做明智地序列化或反序列化。我建议将你关心的Exception部分复制到一个更合理的POCO上。
您可能也可以选择SerializeDynamic
或Serialize
通用 - Jil的约会Serialize(object)
大致相当于SerializeDynamic
,也可能是明确的