带有私有构造函数的类型的JsonSerializationException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有私有构造函数的类型的JsonSerializationException相关的知识,希望对你有一定的参考价值。
我正在将NLog
日志记录语句保存到我的RavenDb
数据库中。 LogEventInfo
类表示一个日志语句,它有一个属性LogLevel
,带有一个私有构造函数。 LogLevel
(Info,Warn等)的实例是通过调用私有构造函数的静态,只读属性创建的。
问题是我希望从数据库中读取消息并查询它们会引发Json.Net
序列化错误:
无法找到用于类型NLog.LogLevel的构造函数。一个类应该有一个默认的构造函数,一个带参数的构造函数或一个用JsonConstructor属性标记的构造函数。路径'Level.Name'。
我怎样才能解决这个错误?可以在这里创建某种Raven索引吗?
答案
我认为最简单的方法是创建一个自定义类来保存所有日志信息。
另一答案
它和我一起工作
create a CustomCreationConverter并将其与对象的反序列化一起使用
public class EventInfoConverter : CustomCreationConverter<LogEventInfo>
{
private string _level { get; set; }
public EventInfoConverter(string s)
{
JToken eventinfo = JObject.Parse(s);
var childs = eventinfo.Children();
foreach (var item in childs)
{
if (((Newtonsoft.Json.Linq.JProperty)item).Name == "Level")
{
var m = ((Newtonsoft.Json.Linq.JProperty)item).Value.Children();
foreach (var item1 in m)
{
_level = ((Newtonsoft.Json.Linq.JProperty)item1).Value.ToString();
break;
}
break;
}
}
}
public override LogEventInfo Create(Type objectType)
{
LogEventInfo eventInfo = new LogEventInfo();
switch (_level)
{
case "Info":
eventInfo = new LogEventInfo(LogLevel.Info, "", "");
break;
case "Debug":
eventInfo = new LogEventInfo(LogLevel.Debug, "", "");
break;
case "Error":
eventInfo = new LogEventInfo(LogLevel.Error, "", "");
break;
case "Warn":
eventInfo = new LogEventInfo(LogLevel.Warn, "", "");
break;
default:
break;
}
return eventInfo;
}
}
- 在反序列化中:
NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); _logger.Log(Newtonsoft.Json.JsonConvert.DeserializeObject<LogEventInfo>(eventInfo, new EventInfoConverter(eventInfo)));
以上是关于带有私有构造函数的类型的JsonSerializationException的主要内容,如果未能解决你的问题,请参考以下文章
C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]