using System; using System.Collections.Generic; using System.IO; using Fantasy.Platform.Net; using Fantasy.Serialize; #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. // ReSharper disable SuspiciousTypeConversion.Global namespace Fantasy.ConfigTable { /// /// 配置表帮助类 /// public static class ConfigTableHelper { private static string _configTableBinaryDirectory; private static readonly object Lock = new object(); // 配置表数据缓存字典 private static readonly Dictionary ConfigDic = new (); /// /// 初始化ConfigTableHelper /// /// public static void Initialize(string configTableBinaryDirectory) { _configTableBinaryDirectory = configTableBinaryDirectory; } /// /// 加载配置表数据 /// /// 配置表类型 /// 配置表数据 public static T Load() where T : ASerialize { lock (Lock) { try { var dataConfig = typeof(T).Name; if (ConfigDic.TryGetValue(dataConfig, out var aProto)) { return (T)aProto; } var configFile = GetConfigPath(dataConfig); var bytes = File.ReadAllBytes(configFile); // Log.Debug($"dataConfig:{dataConfig} {bytes.Length}"); var data = SerializerManager.GetSerializer(FantasySerializerType.ProtoBuf).Deserialize(bytes); ConfigDic[dataConfig] = data; return data; } catch (Exception ex) { throw new Exception($"ConfigTableManage:{typeof(T).Name} 数据表加载之后反序列化时出错:{ex}"); } } } /// /// 获取配置表文件路径 /// /// 配置表名称 /// 配置表文件路径 private static string GetConfigPath(string name) { var configFile = Path.Combine(_configTableBinaryDirectory, $"{name}.bytes"); if (File.Exists(configFile)) { return configFile; } throw new FileNotFoundException($"{name}.byte not found: {configFile}"); } /// /// 重新加载配置表数据 /// public static void ReLoadConfigTable() { lock (Lock) { foreach (var (_, aProto) in ConfigDic) { ((IDisposable) aProto).Dispose(); } ConfigDic.Clear(); } } } }