@@ -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