C# 用于反序列化的秒表替代方案

C# 用于反序列化的秒表替代方案,c#,json,serialization,C#,Json,Serialization,我正在使用一个测量用户登录时间的函数。这是必需的,当程序意外关闭(断电、崩溃、被任务管理器杀死……几乎所有正常注销之外的事情)时,计时器/秒表需要继续运行加上旧值 示例:用户使用程序1分钟。计算机出现蓝屏。用户再次登录1分钟后注销。保存的TimeSpan必须为2分钟 我解决这个问题的方法是:每隔5分钟,程序会将秒表的值作为JSON对象保存到本地计算机的文件中。当用户再次登录时,程序将检查是否存在json文件,该文件包含已运行的秒表的值 我知道,反序列化System.Diagnostics.Sto

我正在使用一个测量用户登录时间的函数。这是必需的,当程序意外关闭(断电、崩溃、被任务管理器杀死……几乎所有正常注销之外的事情)时,计时器/秒表需要继续运行加上旧值

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

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

我知道,反序列化
System.Diagnostics.Stopwatch
是不可能的。我试图编写一个修改版本,这样我就可以有“setter”来添加旧的值

  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);
}

ModifiedStopwatch ModifiedStopwatch=new ModifiedStopwatch();
modifiedStopwatch.Start();
// ....
//每5分钟
使用(StreamWriter file=file.CreateText(路径))
{
var outer=JsonConvert.SerializeObject(modifiedStopwatch);
文件写入线(外部);
}
//撞车
// ....
//重新登录
修改了秒表keepStopwatch;
if(File.Exists(path))
{
var jsonAsString=File.ReadAllText(路径);
keepStopwatch=JsonConvert.DeserializeObject(jsonAsString);
}

我的问题是:

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


是否有解决此问题的现有解决方案?

为什么不使用时间戳?请尝试节省时间跨度如果您的代码正常工作,并且您希望查看代码的所有方面(而不仅仅是其是否适合序列化),您可以将此发布以供全面查看。目前,询问代码是否“坏”是离题的,因为它需要一个意见。@Hereticsmonkey如果我的问题离题,很抱歉。我有这个问题,只想将我的代码作为解决方案显示出来。@Cid,Dmitri Tsoy,我还没有想到。我会试试:)