带有私有构造函数的类型的JsonSerializationException

问题描述 投票:1回答:2

我正在将NLog日志记录语句保存到我的RavenDb数据库中。 LogEventInfo类表示一个日志语句,它有一个属性LogLevel,带有一个私有构造函数。 LogLevel(Info,Warn等)的实例是通过调用私有构造函数的静态,只读属性创建的。

问题是我希望从数据库中读取消息并查询它们会引发Json.Net序列化错误:

无法找到用于类型NLog.LogLevel的构造函数。一个类应该有一个默认的构造函数,一个带参数的构造函数或一个用JsonConstructor属性标记的构造函数。路径'Level.Name'。

我怎样才能解决这个错误?可以在这里创建某种Raven索引吗?

serialization json.net ravendb nlog
2个回答
1
投票

我认为最简单的方法是创建一个自定义类来保存所有日志信息。


1
投票

它和我一起工作

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)));
© www.soinside.com 2019 - 2024. All rights reserved.