using System;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using LC.Newtonsoft.Json;
using TapTap.Common;
namespace TapTap.AntiAddiction.Internal
{
///
/// 通用 JSON 序列化工具
///
internal class Persistence
{
private readonly string _filePath;
internal Persistence(string path)
{
_filePath = path;
}
internal async Task Load() where T : class
{
TapLogger.Debug(_filePath);
if (!File.Exists(_filePath))
{
return null;
}
string text;
using (FileStream fs = File.OpenRead(_filePath))
{
byte[] buffer = new byte[fs.Length];
await fs.ReadAsync(buffer, 0, (int)fs.Length);
text = Encoding.UTF8.GetString(buffer);
}
try
{
return JsonConvert.DeserializeObject(text);
}
catch (Exception e)
{
TapLogger.Error(e);
Delete();
return null;
}
}
internal async Task Save(T obj)
{
if (obj == null)
{
TapLogger.Error("Saved object is null.");
return;
}
string text;
try
{
text = JsonConvert.SerializeObject(obj);
}
catch (Exception e)
{
TapLogger.Error(e);
return;
}
string dirPath = Path.GetDirectoryName(_filePath);
if (!string.IsNullOrEmpty(dirPath) && !Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
}
using (FileStream fs = File.Create(_filePath))
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
await fs.WriteAsync(buffer, 0, buffer.Length);
}
}
internal void Delete()
{
if (!File.Exists(_filePath))
{
return;
}
File.Delete(_filePath);
}
}
}