Быстрый способ сохранить состояние объекта C # - PullRequest
0 голосов
/ 03 июня 2019

Мне нужно сохранять состояние сложного объекта C # каждые 5 минут.

Я использую этот базовый подход ниже.Я нашел «быструю» копию объекта по ссылке внизу.

Если я закомментирую часть «Задача» в WriteToBinaryFileTask, оставив только копию, тогда процесс займет 160 мс.Это слишком долго для моих нужд.Объект может обновляться каждые несколько миллисекунд.Мне нужно взять копию, так как я не могу заблокировать реальный объект во время записи на диск, так как это занимает 1500 мс.

Какие альтернативы я мог бы попытаться сделать из состояния моего объекта.Мне действительно нужно сократить время до 10 мс.

        private void SaveState()
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();

            UtilsBinarySerialization.WriteToBinaryFileTask<int>(StatePath("PreviousSignalMainLogic"), PreviousSignalMainLogic);

            sw.Stop();
            Console.WriteLine("Secs: " + sw.ElapsedMilliseconds);
        }

    public static void WriteToBinaryFileTask<T>(string filePath, T objectToWrite, bool append = false)
    {
        T objectCopy = ObjectExtensions.Copy(objectToWrite);

        Task taskA = new Task(() =>
        {
            using (Stream stream = File.Open(filePath, append ? FileMode.Append : FileMode.Create))
            {
                var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                binaryFormatter.Serialize(stream, objectCopy);
            }
        }
        );
        taskA.Start();

    }

https://github.com/Burtsev-Alexey/net-object-deep-copy/blob/master/ObjectExtensions.cs

...