Из документации MSDN Write-event поддерживает только типы параметров int и string. Я хочу передать созданный пользователем ct в Write-event, как получить эту функциональность? Каким будет правильный сериализатор для достижения этой функциональности?Как сериализовать определенные пользователем объекты в WriteEvent?
1
A
ответ
0
В Windows 10 (также портированном для Win7/8.1) есть поддержка Rich Payload Data поскольку .Net 4.6:
// define a ‘plain old data’ class
[EventData]
class SimpleData {
public string Name { get; set; }
public int Address { get; set; }
}
[EventSource(Name = "Samples-EventSourceDemos-RuntimeDemo")]
public sealed class RuntimeDemoEventSource : EventSource
{
// define the singleton instance of the event source
public static RuntimeDemoEventSource Log = new RuntimeDemoEventSource();
// Rich payloads only work when the self-describing format
private RuntimeDemoEventSource() : base(EventSourceSettings.EtwSelfDescribingEventFormat) { }
// define a new event.
public void LogSimpleData(string message, SimpleData data) { WriteEvent(1, message, data); }
}
RuntimeDemoEventSource.Log.LogSimpleData(
"testMessage",
new SimpleData() { Name = "aName", Address = 234 });
Читать блог и документ для получения более подробной информации.
2
Есть несколько вариантов:
- Использование the new .NET 4.6 feature в качестве magicandre1981 предложил. И это предпочтительный вариант, если вы не должны использовать .NET 4.5, 4.0 или даже 3.5.
- вручную сериализации их в формате JSON или Bond или т.д.
- вручную создать
EventData
-структуру и перейти кWriteEventCore
(должен быть внутриunsafe
) - TPL в настоящее время использует этот метод. - Или вы могли бы this например. Об этом a blog post.
+1
FWIW, Jon Wagner имеет [интересный взнос] (https://github.com/jonwagner/EventSourceProxy) для создания/создания EventSource – Benjol
Xml, Json, custom и т. Д. Правильный сериализатор зависит от того, что вы намерены делать с данными при его выписывании и как вы собираетесь его читать (человек или код). –