using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using System.Reflection;
/// <summary>
/// 可以序列化为Json的静态类,在里面添加字段并调用Save/Load来序列化保存和加载数据
/// </summary>
public static class JsonSerializeable
{
public static PlayerData playerData; //自定义数据类型
#region 保存和加载功能的代码实现
/// <summary>
/// 保存的路径,根据需要修改 PlayerData(为文件名称)
/// </summary>
private static string SavePath = $"{Application.persistentDataPath}/PlayerData";
/// <summary>
/// 保存
/// </summary>
public static void Save()
{
Dictionary<string, object> fieldDic = new Dictionary<string, object>();
Type type = typeof(JsonSerializeable);
FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static);
foreach (FieldInfo fieldInfo in fieldInfos)
{
fieldDic[fieldInfo.Name] = fieldInfo.GetValue(null);
}
string json = JsonConvert.SerializeObject(fieldDic);
string tempPath = SavePath + "_temp";
Directory.CreateDirectory(Path.GetDirectoryName(SavePath));
File.WriteAllText(tempPath, json);
if (File.Exists(SavePath)) File.Delete(SavePath);
File.Move(tempPath, SavePath);
}
/// <summary>
/// 加载
/// </summary>
public static void Load()
{
if (!File.Exists(SavePath)) { throw new Exception("文件不存在"); }
string json = File.ReadAllText(SavePath);
Dictionary<string, JToken> fieldDic = JsonConvert.DeserializeObject<Dictionary<string, JToken>>(json);
Type type = typeof(JsonSerializeable);
FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static);
foreach (FieldInfo fieldInfo in fieldInfos)
{
if (fieldDic.ContainsKey(fieldInfo.Name))
{
fieldInfo.SetValue(null, fieldDic[fieldInfo.Name].ToObject(fieldInfo.FieldType));
}
}
}
/// <summary>
/// 存档文件是否存在
/// </summary>
/// <returns></returns>
public static bool FileExists()
{
return File.Exists(SavePath);
}
/// <summary>
/// 删除存档
/// </summary>
public static void DeleteFile()
{
if (!File.Exists(SavePath))
{
File.Delete(SavePath);
}
}
#endregion
}