Skip to content
This repository was archived by the owner on Aug 15, 2024. It is now read-only.

Commit 7c9b05c

Browse files
committed
feat: new DataNode methods BeforeSave and AfterLoad
1 parent 43b2eaf commit 7c9b05c

File tree

2 files changed

+40
-48
lines changed

2 files changed

+40
-48
lines changed

Packages/com.nuclearband.sodatabase/Runtime/DataNode.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ public class DataNode : SerializedScriptableObject
1313

1414
public string FullPath => $"{(string.IsNullOrEmpty(fullPath) ? string.Empty : $"{fullPath}/")}{name}";
1515

16+
public virtual void BeforeSave()
17+
{
18+
19+
}
20+
21+
public virtual void AfterLoad()
22+
{
23+
24+
}
25+
1626
#if UNITY_EDITOR
1727
public void SetFullPath(string fullPath) => this.fullPath = fullPath;
1828
#endif

Packages/com.nuclearband.sodatabase/Runtime/SODatabase.cs

Lines changed: 30 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -129,43 +129,26 @@ public static async void Save()
129129

130130
public static async Task SaveAsync()
131131
{
132+
var staticNodes = new Dictionary<string, string>();
133+
foreach (var dataNode in DataNodes(root))
134+
{
135+
DataNodeReferenceResolver.CurrentDataNode = dataNode;
136+
dataNode.BeforeSave();
137+
var json = JsonConvert.SerializeObject(dataNode, jsonSerializerSettings);
138+
staticNodes.Add(dataNode.FullPath, json);
139+
}
140+
132141
var save = new SODatabaseSaveFormat
133142
{
134-
StaticNodes = SaveFolderHolder(root, string.Empty)
143+
StaticNodes = staticNodes
135144
};
136-
foreach (var runtimeModelPair in runtimeModels)
145+
foreach (var runtimeModelPair in runtimeModels)
137146
save.RuntimeNodes.Add(runtimeModelPair.Key, JsonConvert.SerializeObject(runtimeModelPair.Value, jsonRuntimeSerializerSettings));
138147

139148
using var fileStream = new StreamWriter(SavePath);
140149
await fileStream.WriteAsync(JsonConvert.SerializeObject(save));
141150
}
142151

143-
static Dictionary<string, string> SaveFolderHolder(FolderHolder folderHolder, string path)
144-
{
145-
var res = new Dictionary<string, string>();
146-
foreach (var dataNodePair in folderHolder.DataNodes)
147-
{
148-
var fullPath = dataNodePair.Key;
149-
if (!string.IsNullOrEmpty(path))
150-
fullPath = path + '/' + fullPath;
151-
DataNodeReferenceResolver.CurrentDataNode = dataNodePair.Value;
152-
var json = JsonConvert.SerializeObject(dataNodePair.Value, jsonSerializerSettings);
153-
res.Add(fullPath, json);
154-
}
155-
156-
foreach (var folderHolderPair in folderHolder.FolderHolders)
157-
{
158-
var fullPath = folderHolderPair.Key;
159-
if (!string.IsNullOrEmpty(path))
160-
fullPath = path + '/' + fullPath;
161-
162-
var resAdd = SaveFolderHolder(folderHolderPair.Value, fullPath);
163-
resAdd.ForEach(x => res.Add(x.Key, x.Value));
164-
}
165-
166-
return res;
167-
}
168-
169152
public static async void Load()
170153
{
171154
await LoadAsync();
@@ -179,38 +162,37 @@ public static async Task LoadAsync()
179162
using var fileStream = new StreamReader(SavePath);
180163
var serializedDictionary = await fileStream.ReadToEndAsync();
181164
var save = JsonConvert.DeserializeObject<SODatabaseSaveFormat>(serializedDictionary);
182-
LoadFolderHolder(root, string.Empty, save.StaticNodes);
165+
166+
foreach (var dataNode in DataNodes(root))
167+
{
168+
DataNodeReferenceResolver.CurrentDataNode = dataNode;
169+
var json = save.StaticNodes.ContainsKey(dataNode.FullPath) ? save.StaticNodes[dataNode.FullPath] : string.Empty;
170+
if (string.IsNullOrEmpty(json))
171+
continue;
172+
DataNodeReferenceResolver.CurrentDataNode = dataNode;
173+
JsonConvert.PopulateObject(json, dataNode, jsonSerializerSettings);
174+
}
175+
183176
runtimeModels.Clear();
184177
foreach (var runtimeNodePair in save.RuntimeNodes)
185178
{
186179
var x = JsonConvert.DeserializeObject(runtimeNodePair.Value, jsonRuntimeSerializerSettings)!;
187180
runtimeModels.Add(runtimeNodePair.Key, x);
188181
}
189-
}
190182

191-
static void LoadFolderHolder(FolderHolder folderHolder, string path, Dictionary<string, string> data)
183+
foreach (var dataNode in DataNodes(root))
184+
dataNode.AfterLoad();
185+
}
186+
private static IEnumerable<DataNode> DataNodes(FolderHolder folderHolder)
192187
{
193188
foreach (var dataNodePair in folderHolder.DataNodes)
194-
{
195-
var fullPath = dataNodePair.Key;
196-
if (!string.IsNullOrEmpty(path))
197-
fullPath = path + '/' + fullPath;
198-
var json = data.ContainsKey(fullPath) ? data[fullPath] : string.Empty;
199-
if (string.IsNullOrEmpty(json))
200-
continue;
201-
DataNodeReferenceResolver.CurrentDataNode = dataNodePair.Value;
202-
JsonConvert.PopulateObject(json, dataNodePair.Value, jsonSerializerSettings);
203-
}
189+
yield return dataNodePair.Value;
204190

205191
foreach (var folderHolderPair in folderHolder.FolderHolders)
206-
{
207-
var fullPath = folderHolderPair.Key;
208-
if (!string.IsNullOrEmpty(path))
209-
fullPath = path + '/' + fullPath;
210-
LoadFolderHolder(folderHolderPair.Value, fullPath, data);
211-
}
192+
foreach (var dataNode in DataNodes(folderHolderPair.Value))
193+
yield return dataNode;
212194
}
213-
195+
214196
public static T GetRuntimeModel<T>(string path, Func<T>? allocator = null) where T : class
215197
{
216198
T model;

0 commit comments

Comments
 (0)