Jil Serializer Method只能在Type.IsGenericParameter为true的Type上调用

时间:2016-04-27 21:22:08

标签: c# json serialization jil

我有一个自定义日志消息对象,我试图用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对象,我需要做什么?

1 个答案:

答案 0 :(得分:2)

这里的根本问题是System.Exception并不意味着序列化。它包含各种各样的&#34;只能在这台机器上运行&#34;信息。

通常情况下,Jil会忽略很多内容,但是Options告诉includeInherited,这意味着它会在System.Exception上公开所有公开内容}。其中包括System.RuntimeTypeHandleSystem.RuntimeType等内容。

Jil应该以如此无益的方式爆炸(我正在做一个记录去弄清楚如何检测这些情况并更好地报告它们),但那些类型的人不能这样做明智地序列化或反序列化。我建议将你关心的Exception部分复制到一个更合理的POCO上。

您可能也可以选择SerializeDynamicSerialize通用 - Jil的约会Serialize(object)大致相当于SerializeDynamic,也可能是明确的