我正在尝试收集满足特定查询的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,但我不清楚如何对一个声明/规范不是由自己写的。
感谢任何和所有帮助/建议。
答案 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
。