使用Newtonsoft(Json.NET)序列化System.Diagnostics.EventLogEntry集合

时间:2015-11-15 16:46:41

标签: c# json mongodb serialization json.net

我正在尝试收集满足特定查询的Windows事件并将它们序列化为JSON,以便我可以将该集合导入MongoDB数据库。这只是我练习和鬼混,但我在这一点上陷入困​​境,并希望能够继续前进。

问题:

当我使用JsonConvert.SerializeObject(...)时,我肯定会让它序列化类似于对象的东西,因为有一些属性可以存活:

public class EventSerializer
{
    public static void Serialize(EventLogEntry eventLogEntry)
    {
        var traceWriter = new MemoryTraceWriter();
        JsonConvert.SerializeObject(eventLogEntry, Formatting.Indented, new JsonSerializerSettings
        {
            TraceWriter = traceWriter
        });
        Console.WriteLine(traceWriter);
    }
}

输出:

{
    "DataBuffer": "<seemingly-random, long string>",
    "LogName": "Application",
    "MachineName": "<my machine's name>"
}

我甚至可以反序列化对象并获得我期望的结果。但我真的不想在那里使用DataBuffer键值对,我希望EventLogEntry的内容可读,以便我可以从MongoDB中解析出这些信息。

我一直在查看Json.NET的文档,我想知道我是否需要创建自己的Converter或其他内容,但我和#39}从这里开始理解这一切都有点麻烦。还有一个关于选择加入/退出序列化特定属性/字段的能力的讨论,in the documentation,但我不清楚如何对一个声明/规范不是由自己写的。

感谢任何和所有帮助/建议。

1 个答案:

答案 0 :(得分:2)

据我所知,您无法将JSON反序列化为新的EventLogEntry对象。一个原因是EventLogEntry中的某些属性是只读属性,而这些属性的getter包含计算值的逻辑,即它们不是从内部存储字段获取值的简单getter。 / p>

我建议您创建一个特殊对象来保存数据。这是一个例子:

public class MyEventLogEntry
{
    public string MachineName { get; set; }
    public DateTime GeneratedTime { get; set; }
    public string Message { get; set; }
    public long InstanceId { get; set; } 
}

您可以在此类中添加您感兴趣的事件属性。它们甚至可以具有与EventLogEntry内的名称不同的名称。

您可以使用AutoMapper轻松地从EventLogEntry转换为MyEventLogEntry。或者,如果需要,您可以手动执行此操作。

以下是使用AutoMapper的代码示例:

AutoMapper.Mapper.CreateMap<EventLogEntry, MyEventLogEntry>()
    .ForMember(dst => dst.InstanceId, opt => opt.MapFrom(src => src.InstanceId))
    .ForMember(dst => dst.Message, opt => opt.MapFrom(src => src.Message))
    .ForMember(dst => dst.GeneratedTime, opt => opt.MapFrom(src => src.TimeGenerated))
    .ForMember(dst => dst.MachineName, opt => opt.MapFrom(src => src.MachineName));

EventLog log = new EventLog("Application");

EventLogEntry entry = log.Entries[0];

MyEventLogEntry my_entry = AutoMapper.Mapper.Map<EventLogEntry, MyEventLogEntry>(entry);

string json = JsonConvert.SerializeObject(my_entry);

MyEventLogEntry deserialized_entry = JsonConvert.DeserializeObject<MyEventLogEntry>(json);

请注意,拨打AutoMapper.Mapper.CreateMap只需要拨打一次(例如,在申请开始时)。

如果要从数据库读取/写入数据库,可以使用MyEventLogEntry