From 9946014202aad001d4244eca515101e9ec67d800 Mon Sep 17 00:00:00 2001 From: jkpete <1031139173@qq.com> Date: Mon, 14 Apr 2025 15:51:47 +0800 Subject: [PATCH] marked egbyte save not use,define the protocol for the byte save,add sync and async for save tools interface,new Interface: ObjectSave add,update and remove --- .../Module/{SaveTools => }/EGSave.cs | 46 ++++++++------- .../Module/SaveTools/EGByteSave.cs | 59 ++++++++++++++++--- .../Module/SaveTools/EGJsonSave.cs | 47 +++++++++++++++ .../Module/SaveTools/SaveToolsInterface.cs | 37 +++++++++++- 4 files changed, 159 insertions(+), 30 deletions(-) rename addons/EGFramework/Module/{SaveTools => }/EGSave.cs (97%) diff --git a/addons/EGFramework/Module/SaveTools/EGSave.cs b/addons/EGFramework/Module/EGSave.cs similarity index 97% rename from addons/EGFramework/Module/SaveTools/EGSave.cs rename to addons/EGFramework/Module/EGSave.cs index 28f1502..a7cabad 100644 --- a/addons/EGFramework/Module/SaveTools/EGSave.cs +++ b/addons/EGFramework/Module/EGSave.cs @@ -34,7 +34,7 @@ namespace EGFramework { LoadObjectFile("SaveData/DefaultJsonSave.json"); } - + #region Load Data or Object and Unload public void LoadDataFile(string path) where TSaveData:IEGSaveData,IEGSave,new(){ TSaveData saveData = new TSaveData(); saveData.InitSaveFile(path); @@ -110,7 +110,9 @@ namespace EGFramework throw new Exception("Key is not found!"); } } - + #endregion + + #region Keys Operation public List GetKeys(){ List keys = new List(); foreach(string key in DataBaseReadOnly.Keys){ @@ -128,14 +130,9 @@ namespace EGFramework return keys; } - public void SetObject(string path,string objectKey,TObject obj){ - if(ObjectFiles.ContainsKey(path)){ - ObjectFiles[path].SetObject(objectKey,obj); - }else{ - throw new Exception("File not loaded, you should use LoadObjectFile(key) first."); - } - } + #endregion + #region Get or Search data and object public TObject GetObject(string path,string key) where TObject : new(){ if(ObjectFiles.ContainsKey(path)){ return ObjectFiles[path].GetObject(key); @@ -145,14 +142,6 @@ namespace EGFramework throw new Exception("File not loaded, you should use LoadObjectFile(key) or ReadObject(key) first."); } } - - public void SetData(string path,string dataKey,TData data,int id){ - if(DataBaseFiles.ContainsKey(path)){ - DataBaseFiles[path].SetData(dataKey,data,id); - }else{ - throw new Exception("File not loaded, you should use LoadDataFile(path) first."); - } - } public TData GetData(string keyOrPath,string key,int id) where TData : new(){ if(DataBaseFiles.ContainsKey(keyOrPath)){ return DataBaseFiles[keyOrPath].GetData(key,id); @@ -172,6 +161,25 @@ namespace EGFramework throw new Exception("File not loaded, you should use LoadDataFile(key) or ReadData(key,data) first."); } } + #endregion + + #region Set or Add or Update data and object + public void SetObject(string path,string objectKey,TObject obj){ + if(ObjectFiles.ContainsKey(path)){ + ObjectFiles[path].SetObject(objectKey,obj); + }else{ + throw new Exception("File not loaded, you should use LoadObjectFile(key) first."); + } + } + + public void SetData(string path,string dataKey,TData data,int id){ + if(DataBaseFiles.ContainsKey(path)){ + DataBaseFiles[path].SetData(dataKey,data,id); + }else{ + throw new Exception("File not loaded, you should use LoadDataFile(path) first."); + } + } + public IEnumerable FindData(string keyOrPath,string key,System.Linq.Expressions.Expression> expression) where TData : new(){ if(DataBaseFiles.ContainsKey(keyOrPath)){ @@ -182,9 +190,7 @@ namespace EGFramework throw new Exception("File not loaded, you should use LoadDataFile(key) or ReadData(key,data) first."); } } - - - //------------------------------------------------------------------------------// + #endregion #region Default Json Operation public void SetObjectToJson(TObject obj){ diff --git a/addons/EGFramework/Module/SaveTools/EGByteSave.cs b/addons/EGFramework/Module/SaveTools/EGByteSave.cs index bdb3aa8..a900ea6 100644 --- a/addons/EGFramework/Module/SaveTools/EGByteSave.cs +++ b/addons/EGFramework/Module/SaveTools/EGByteSave.cs @@ -1,16 +1,30 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace EGFramework { - [Obsolete("this idea can be replaced by EGFileStream")] - public class EGByteSave : IEGSave,IEGSaveObject + /// Pointer max length is 4294967295. + /// Data protocol: + /// [XX XX XX XX](Pointer length) [XX XX XX XX]...[XX XX XX XX](Pointers) [DataBlock 1]...[DataBlock N](Data) + /// 1. The first (four byte) is the length of the data pointers (uint type). + /// 2. The pointer List is the position to the data block. + /// 3. The data block is the data you want to save. + public interface IEGByteObject{ + byte[] GetBytes(); + void SetBytes(byte[] byteData); + } + [Obsolete("This class is not comlpete, please not use it!")] + public class EGByteObjectSave : IEGSave,IEGSaveObject { public Encoding StringEncoding { set; get; } = Encoding.ASCII; private string DefaultPath { set; get; } - private byte[] Data { get; set; } + private uint PointerLength { get; set; } + private uint[] Pointer { get; set; } + private Dictionary Data { get; set; } + private byte[] _Data; public void ReadDataBlock(string path){ DefaultPath = path; @@ -21,7 +35,7 @@ namespace EGFramework fileStream.Read(buffer, 0, (int)fileStream.Length); fileStream.Close(); fileStream.Dispose(); - Data = buffer; + _Data = buffer; } catch (System.Exception e) { @@ -33,7 +47,7 @@ namespace EGFramework try { FileStream fileStream = File.Create(path); - fileStream.Write(Data,0,Data.Length); + fileStream.Write(_Data,0,_Data.Length); fileStream.Close(); fileStream.Dispose(); } @@ -49,10 +63,16 @@ namespace EGFramework ReadDataBlock(path); } + /// + /// Set object to the file,the pointer + /// + /// + /// + /// public void SetObject(string objectKey , TObject obj) { - if(typeof(TObject).GetInterfaces().Contains(typeof(IRequest))){ - Data = ((IRequest)obj).ToProtocolByteData(); + if(typeof(TObject).GetInterfaces().Contains(typeof(IEGByteObject))){ + _Data = ((IEGByteObject)obj).GetBytes(); }else{ throw new Exception("This byte class cannot be serialized! you should implement IRequest first!"); } @@ -61,14 +81,35 @@ namespace EGFramework public TObject GetObject(string objectKey) where TObject : new() { - if(typeof(TObject).GetInterfaces().Contains(typeof(IResponse))){ + if(typeof(TObject).GetInterfaces().Contains(typeof(IEGByteObject))){ TObject result = new TObject(); - ((IResponse)result).TrySetData(StringEncoding.GetString(Data),Data); + ((IEGByteObject)result).SetBytes(_Data); return result; }else{ throw new Exception("This byte class cannot be serialized! you should implement IRequest first!"); } } + + public void RemoveObject(string objectKey) + { + throw new NotImplementedException(); + } + + public void AddObject(string objectKey, TObject obj) + { + throw new NotImplementedException(); + } + + public void UpdateObject(string objectKey, TObject obj) + { + throw new NotImplementedException(); + } + + public IEnumerable GetKeys() + { + throw new NotImplementedException(); + } + } public interface IEGByteInit{ diff --git a/addons/EGFramework/Module/SaveTools/EGJsonSave.cs b/addons/EGFramework/Module/SaveTools/EGJsonSave.cs index 65d5fed..749170e 100644 --- a/addons/EGFramework/Module/SaveTools/EGJsonSave.cs +++ b/addons/EGFramework/Module/SaveTools/EGJsonSave.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Text; using Newtonsoft.Json; @@ -79,5 +80,51 @@ namespace EGFramework return data; } + public void RemoveObject(string objectKey) + { + if(IsReadOnly){ + throw new Exception("This file is readonly! can't set any object to file."); + } + if(SaveObject.ContainsKey(objectKey)){ + SaveObject.Remove(objectKey); + } + File.WriteAllText(DefaultPath,JsonConvert.SerializeObject(SaveObject,Formatting.Indented)); + } + + public void AddObject(string objectKey, TObject obj) + { + if(IsReadOnly){ + throw new Exception("This file is readonly! can't set any object to file."); + } + if(!SaveObject.ContainsKey(objectKey)){ + SaveObject.Add(objectKey,JToken.FromObject(obj)); + }else{ + throw new Exception("Key already exists!"); + } + File.WriteAllText(DefaultPath,JsonConvert.SerializeObject(SaveObject,Formatting.Indented)); + } + + public void UpdateObject(string objectKey, TObject obj) + { + if(IsReadOnly){ + throw new Exception("This file is readonly! can't set any object to file."); + } + if(SaveObject.ContainsKey(objectKey)){ + SaveObject[objectKey] = JToken.FromObject(obj); + }else{ + throw new Exception("Key not found!"); + } + File.WriteAllText(DefaultPath,JsonConvert.SerializeObject(SaveObject,Formatting.Indented)); + } + + public IEnumerable GetKeys() + { + List keys = new List(); + foreach(string key in SaveObject.Properties()) + { + keys.Add(key); + } + return keys; + } } } \ No newline at end of file diff --git a/addons/EGFramework/Module/SaveTools/SaveToolsInterface.cs b/addons/EGFramework/Module/SaveTools/SaveToolsInterface.cs index 80b1c54..8d0747b 100644 --- a/addons/EGFramework/Module/SaveTools/SaveToolsInterface.cs +++ b/addons/EGFramework/Module/SaveTools/SaveToolsInterface.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; namespace EGFramework { + #region Sync_Interface public interface IEGSave{ void InitSaveFile(string path); } @@ -17,6 +18,7 @@ namespace EGFramework public interface IEGSaveObjectReadOnly{ TObject GetObject(string objectKey) where TObject : new(); + IEnumerable GetKeys(); } public interface IEGSaveDataReadOnly{ TData GetData(string dataKey,object id) where TData : new(); @@ -25,11 +27,44 @@ namespace EGFramework } public interface IEGSaveObject : IEGSaveObjectReadOnly{ + /// + /// SetObject will add a object if it not exisits, replace the object if it already exists. + /// + /// + /// + /// void SetObject(string objectKey,TObject obj); + void RemoveObject(string objectKey); + void AddObject(string objectKey,TObject obj); + void UpdateObject(string objectKey,TObject obj); } - // public interface IEGSaveData : IEGSaveDataReadOnly{ void SetData(string dataKey,TData data,object id); } + #endregion + + #region Async_Interface + public interface IEGSaveAsync{ + Task InitSaveFileAsync(string path); + } + public interface IEGSaveReadOnlyAsync{ + Task InitReadOnlyAsync(string data); + Task InitReadOnlyAsync(byte[] data); + } + public interface IEGSaveObjectReadOnlyAsync{ + Task GetObjectAsync(string objectKey) where TObject : new(); + } + public interface IEGSaveDataReadOnlyAsync{ + Task GetDataAsync(string dataKey,object id) where TData : new(); + Task> GetAllAsync(string dataKey) where TData : new(); + Task> FindDataAsync(string dataKey,Expression> expression) where TData : new(); + } + public interface IEGSaveObjectAsync : IEGSaveObjectReadOnlyAsync{ + Task SetObjectAsync(string objectKey,TObject obj); + } + public interface IEGSaveDataAsync : IEGSaveDataReadOnlyAsync{ + Task SetDataAsync(string dataKey,TData data,object id); + } + #endregion } \ No newline at end of file