C #: как сериализовать / десериализовать объект класса EventBookmark - PullRequest
0 голосов
/ 26 октября 2019

Я использую EventLogWatcher для отслеживания событий из журналов. Мне нужно сохранить / восстановить события закладки после того, как моя программа остановилась / запустилась. Закладка событий представлена ​​ EventBookmark class https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.eventing.reader.eventbookmark?view=netframework-4.8 и наследуется от интерфейса ISerializable. НО я не могу сериализовать объект этого класса. Потому что у него нет ctor по умолчанию, ctor без параметров. Я не очень хорошо знаком с C # , потому что использую его в течение недели. Не могли бы вы помочь мне понять, почему этот класс унаследован от интерфейса ISerializable, а я не могу сериализовать объект этого класса? Это выглядит странно для меня, как будто я чего-то не понимаю, но я хотел бы знать это. Более того, конструктор EventBookmark (SerializationInfo, StreamingContext) и GetObjectData (SerializationInfo, StreamingContext) защищены.

Итак, как сериализовать и десериализовать объект EventBookmark класса?

ОБНОВЛЕНО (рабочий код), спасибо jdweng за помощь

namespace ConsoleApp
{
    using System;

    public class Program
    {
        static void Main(string[] args)
        {
            string logName = "Application";
            string filter = "*";
            System.Diagnostics.Eventing.Reader.EventLogQuery eventQuery = new System.Diagnostics.Eventing.Reader.EventLogQuery(
                logName,
                System.Diagnostics.Eventing.Reader.PathType.LogName,
                filter
            );
            System.Diagnostics.Eventing.Reader.EventLogReader eventLogReader = new System.Diagnostics.Eventing.Reader.EventLogReader(eventQuery);
            System.Diagnostics.Eventing.Reader.EventRecord eventRecord = eventLogReader.ReadEvent();
            System.Diagnostics.Eventing.Reader.EventBookmark eventBookmark = eventRecord.Bookmark;
            if (eventBookmark != null)
            {
                System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                System.IO.Stream stream = new System.IO.MemoryStream();
                formatter.Serialize(stream, eventBookmark);
                stream.Position = 0;
                System.IO.StreamReader reader = new System.IO.StreamReader(stream);
                string result = reader.ReadToEnd();
                Console.WriteLine("event bookmark: {0}", result);
                stream.Position = 0;
                System.Diagnostics.Eventing.Reader.EventBookmark newEventBookmark = (System.Diagnostics.Eventing.Reader.EventBookmark)formatter.Deserialize(stream);
                if (newEventBookmark != null/* && eventBookmark.Equals(newEventBookmark)*/)
                {
                    Console.WriteLine("Deserialization successfully passed");
                }
                else
                {
                    Console.WriteLine("Deserialization failed");
                }
            }
            else
            {
                Console.WriteLine("cannot read event bookmark");
            }
            Console.ReadKey();
        }
    }
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...