秒表反序列化的替代方法

我正在使用一种测量用户登录时间的功能。要求当程序意外关闭(失去电源,崩溃,被任务管理器终止...除了正常注销外,几乎所有其他操作),计时器/秒表需要继续运行并加上旧值。

示例:用户使用程序1分钟。电脑出现蓝屏。用户再次登录1分钟并注销。保存的TimeSpan必须为2分钟。

我解决该问题的方法是:每5分钟,该程序会将Stopwatch的值作为JSON对象保存到本地计算机的文件中。当用户再次登录时,程序将检查是否有一个json文件,其中包含已经运行的Stopwatch的值。

我知道,无法对System.Diagnostics.Stopwatch进行反序列化。我试图编写它的修改版本,以便可以有“设定者”来增加旧值。

  public class ModifiedStopwatch
  {
        private readonly Stopwatch Stopwatch;
        private TimeSpan elapsed;
        [JsonProperty]
        private TimeSpan Elapsed { get => elapsed + Stopwatch.Elapsed; set => elapsed = value; }
        public ModifiedStopwatch()
        {
            Stopwatch = new Stopwatch();
            Elapsed = TimeSpan.Zero;
        }
        public ModifiedStopwatch(TimeSpan timeSpan)
        {
            Stopwatch = new Stopwatch();
            Elapsed = timeSpan;
        }
        public void SetElapsed(TimeSpan timeSpan) => Elapsed = timeSpan;
        public void Start() => Stopwatch.Start();
        public void Stop() => Stopwatch.Stop();
        public void Restart() => Stopwatch.Restart();
        public void Reset() => Stopwatch.Reset();
    }

实际上,它看起来像这样

ModifiedStopwatch modifiedStopwatch = new ModifiedStopwatch();
modifiedStopwatch.Start();
// ....
// Every 5 mins
using (StreamWriter file = File.CreateText(path))
{
    var outer = JsonConvert.SerializeObject(modifiedStopwatch);
    file.WriteLine(outer);
}
// Crash
// ....
// Re login
ModifiedStopwatch keepStopwatch;
if (File.Exists(path))
{
    var jsonAsString = File.ReadAllText(path);
    keepStopwatch = JsonConvert.DeserializeObject<ModifiedStopwatch>(jsonAsString);
}


我的问题是:

我的解决方案不好还是容易出错? (我不知道)

是否存在解决此问题的解决方案?

kouder 回答:秒表反序列化的替代方法

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3158648.html

大家都在问