@@ -106,8 +106,14 @@ public void NotifyOverrideChangeInState(string name, bool isOverriden)
106106 targetFieldInfo . GetValue ( _target ) == parentFieldInfo . GetValue ( _parent ) )
107107 {
108108 object parentObject = parentFieldInfo . GetValue ( _parent ) ;
109- object parentObjectCopy =
110- Clone ( parentObject ) ;
109+
110+ var jsonSettings = new Newtonsoft . Json . JsonSerializerSettings ( )
111+ {
112+ ReferenceLoopHandling = Newtonsoft . Json . ReferenceLoopHandling . Ignore ,
113+ TypeNameHandling = Newtonsoft . Json . TypeNameHandling . All
114+ } ;
115+ var serialized = JsonConvert . SerializeObject ( parentObject , jsonSettings ) ;
116+ object parentObjectCopy = JsonConvert . DeserializeObject < object > ( serialized , jsonSettings ) ;
111117 targetFieldInfo . SetValue ( _target , parentObjectCopy ) ;
112118 }
113119 }
@@ -168,9 +174,9 @@ public void LoadData(T targetObject)
168174 {
169175 string data = _import . userData ;
170176 var extractedData = ExtractData ( data ) ;
171- _parent = extractedData . Item2 ;
172- _overridden = extractedData . Item3 ?? new List < string > ( ) ;
173- _children = extractedData . Item4 ?? new List < string > ( ) ;
177+ _parent = extractedData . parent ;
178+ _overridden = extractedData . overridden ?? new List < string > ( ) ;
179+ _children = extractedData . children ?? new List < string > ( ) ;
174180 }
175181 catch
176182 {
@@ -180,24 +186,28 @@ public void LoadData(T targetObject)
180186 }
181187 }
182188
183- private Tuple < string , T , List < string > , List < string > > ExtractData ( string data )
189+
190+ private ( string parentGUID , T parent , List < string > overridden , List < string > children ) ExtractData ( string data )
184191 {
185- if ( string . IsNullOrEmpty ( data ) )
186- return new Tuple < string , T , List < string > , List < string > > ( null , null , null , null ) ;
192+ if ( ! CheckForDataString ( data ) )
193+ return ( null , null , null , null ) ;
187194 try
188195 {
189- string dataJson = JsonConvert . DeserializeObject < Dictionary < string , string > > ( data ) [ "SOVariantData" ] ;
196+ string dataJson = GetSOVariantData ( data ) ;
197+ if ( ! CheckForDataString ( dataJson ) )
198+ return ( null , null , null , null ) ;
190199 Dictionary < string , string > containedData =
191200 JsonConvert . DeserializeObject < Dictionary < string , string > > ( dataJson ) ;
192201
193202 string parentGUID = containedData [ "parentGUID" ] ;
203+
194204 var parent = AssetDatabase . LoadAssetAtPath < T > ( AssetDatabase . GUIDToAssetPath ( parentGUID ) ) ;
195205
196206 var overridden = JsonConvert . DeserializeObject < List < string > > ( containedData [ "overriddenFields" ] ) ;
197207
198208 var children = JsonConvert . DeserializeObject < List < string > > ( containedData [ "childrenGUIDs" ] ) ;
199209
200- return new Tuple < string , T , List < string > , List < string > > ( parentGUID , parent , overridden , children ) ;
210+ return ( parentGUID , parent , overridden , children ) ;
201211 }
202212 catch
203213 {
@@ -215,25 +225,27 @@ private Tuple<string, T, List<string>, List<string>> ExtractData(string data)
215225 "Try again" ) )
216226 {
217227 case ( 0 ) :
218- return new Tuple < string , T , List < string > , List < string > > ( null , null , null , null ) ;
228+ return ( null , null , null , null ) ;
219229 case ( 1 ) :
220230 Debug . Log ( $ "UserData not overwritten.") ;
221231 _SOVariantProperlyLoaded = false ;
222- return null ;
232+ return ( null , null , null , null ) ; ;
223233 case ( 2 ) :
224234 return ExtractData ( ReadUpdatedMetaFile ( data ) ) ;
225235 }
226236 }
237+ return ( null , null , null , null ) ;
238+ }
227239
228- return null ;
240+ private static string GetSOVariantData ( string data )
241+ {
242+ string dataJson = JsonConvert . DeserializeObject < Dictionary < string , string > > ( data ) [ "SOVariantData" ] ;
243+ return dataJson ;
229244 }
230245
231- private List < string > DeserializeChildrenData ( string data )
246+ private bool CheckForDataString ( string data )
232247 {
233- // byte[] childrenDataStream = data.Split(',').ToList().Select(source => byte.Parse(source)).ToArray();
234- // var children = SerializationUtility.DeserializeValue<List<string>>(childrenDataStream, DataFormat.Binary);
235- var children = JsonConvert . DeserializeObject < List < string > > ( data ) ;
236- return children ;
248+ return ! string . IsNullOrEmpty ( data ) ;
237249 }
238250
239251 private void SetAllFieldsToParent ( )
@@ -301,15 +313,15 @@ private void PropagateValuesToChildren(T target, string targetGUID, ref List<str
301313
302314 var extractedData = ExtractData ( childImporter . userData ) ;
303315
304- if ( extractedData . Item1 == null || extractedData . Item2 == null || extractedData . Item3 == null ||
305- extractedData . Item4 == null )
316+ if ( extractedData . parentGUID == null || extractedData . parent == null || extractedData . overridden == null ||
317+ extractedData . children == null )
306318 {
307319 children . Remove ( child ) ;
308320 childrenUpdated = true ;
309321 continue ;
310322 }
311323
312- string parentGUID = extractedData . Item1 ;
324+ string parentGUID = extractedData . parentGUID ;
313325
314326 if ( parentGUID != targetGUID )
315327 {
@@ -318,7 +330,7 @@ private void PropagateValuesToChildren(T target, string targetGUID, ref List<str
318330 continue ;
319331 }
320332
321- List < string > overridden = extractedData . Item3 ;
333+ List < string > overridden = extractedData . overridden ;
322334 T childObject = AssetDatabase . LoadAssetAtPath < T > ( childPath ) ;
323335 bool childChanged = false ;
324336 foreach ( FieldInfo fieldInfo in fieldInfos )
@@ -339,7 +351,7 @@ private void PropagateValuesToChildren(T target, string targetGUID, ref List<str
339351 EditorUtility . SetDirty ( childObject ) ;
340352
341353
342- List < string > newChildrenList = extractedData . Item4 ;
354+ List < string > newChildrenList = extractedData . children ;
343355 if ( newChildrenList . Count > 0 )
344356 PropagateValuesToChildren ( childObject , AssetDatabase . AssetPathToGUID ( childPath ) ,
345357 ref newChildrenList , importer , changedValues ) ;
@@ -353,36 +365,27 @@ private void PropagateValuesToChildren(T target, string targetGUID, ref List<str
353365
354366 private void AddToChildrenData ( AssetImporter importer , string newChild )
355367 {
356- string [ ] data = importer . userData . Split ( '*' ) ;
357- if ( data . Length != 3 )
358- {
359- WriteOnlyChildrenData ( importer , new List < string > ( ) { newChild } ) ;
360- return ;
361- }
368+ var extractedData = ExtractData ( importer . userData ) ;
362369
363- List < string > children = DeserializeChildrenData ( data [ 2 ] ) ;
370+ List < string > children = extractedData . children ?? new List < string > ( ) ;
364371 children . Add ( newChild ) ;
365- WriteOnlyChildrenData ( importer , children ) ;
372+ WriteToImporter ( importer , SerializeParentData ( extractedData . parent ) , SerializeOverrideData ( extractedData . overridden ) , SerializeChildrenData ( children ) ) ;
366373 }
367374
368375 public void RemoveFromChildrenData ( AssetImporter importer , string oldChild )
369376 {
370- string [ ] data = importer . userData . Split ( '*' ) ;
371- if ( data . Length != 3 )
372- return ;
373- List < string > children = DeserializeChildrenData ( data [ 2 ] ) ;
377+ var extractedData = ExtractData ( importer . userData ) ;
378+
379+ List < string > children = extractedData . children ?? new List < string > ( ) ;
380+
374381 children . Remove ( oldChild ) ;
375- WriteOnlyChildrenData ( importer , children ) ;
382+ WriteToImporter ( importer , SerializeParentData ( extractedData . parent ) , SerializeOverrideData ( extractedData . overridden ) , SerializeChildrenData ( children ) ) ;
376383 }
377384
378385 private void WriteOnlyChildrenData ( AssetImporter importer , List < string > children )
379386 {
380- string [ ] data = importer . userData . Split ( '*' ) ;
381- if ( data . Length == 3 )
382- WriteToImporter ( importer , data [ 0 ] , data [ 1 ] , SerializeChildrenData ( children ) ) ;
383- else
384- WriteToImporter ( importer , SerializeParentData ( null ) , SerializeOverrideData ( new List < string > ( ) ) ,
385- SerializeChildrenData ( children ) ) ;
387+ var extractedData = ExtractData ( importer . userData ) ;
388+ WriteToImporter ( importer , SerializeParentData ( extractedData . parent ) , SerializeOverrideData ( extractedData . overridden ) , SerializeChildrenData ( children ) ) ;
386389 }
387390
388391 public void SaveData ( List < string > overriddenMembers , List < string > changedValues = null )
@@ -407,13 +410,11 @@ public void SaveData(List<string> overriddenMembers, List<string> changedValues
407410
408411 private string SerializeChildrenData ( List < string > children )
409412 {
410- // return string.Join(",", SerializationUtility.SerializeValue<List<string>>(children, DataFormat.Binary));
411413 return JsonConvert . SerializeObject ( children ) ;
412414 }
413415
414416 private string SerializeParentData ( T parent )
415417 {
416- // return string.Join(",", SerializationUtility.SerializeValue<string>(AssetDatabase.GUIDFromAssetPath(AssetDatabase.GetAssetPath(parent)).ToString(), DataFormat.Binary));
417418 return AssetDatabase . GUIDFromAssetPath ( AssetDatabase . GetAssetPath ( parent ) ) . ToString ( ) ;
418419 }
419420
@@ -423,7 +424,6 @@ private string SerializeOverrideData(List<string> overrides)
423424 overrides . All ( s => s != _otherSerializationBackend . First ( ) ) )
424425 overrides . AddRange ( _otherSerializationBackend ) ;
425426
426- // return string.Join(",", SerializationUtility.SerializeValue<List<string>>(overrides, DataFormat.Binary));
427427 return JsonConvert . SerializeObject ( overrides ) ;
428428 }
429429
@@ -505,19 +505,5 @@ private string ReadUpdatedMetaFile(string oldData)
505505
506506 return oldData ;
507507 }
508-
509- private T Clone < T > ( T source )
510- {
511- var jsonSettings = new Newtonsoft . Json . JsonSerializerSettings ( ) {
512- // Use this option
513- //
514- // to ignore reference looping option
515- ReferenceLoopHandling = Newtonsoft . Json . ReferenceLoopHandling . Ignore ,
516- // Use this option when properties use an Interface as the type
517- TypeNameHandling = Newtonsoft . Json . TypeNameHandling . All
518- } ;
519- var serialized = JsonConvert . SerializeObject ( source , jsonSettings ) ;
520- return JsonConvert . DeserializeObject < T > ( serialized , jsonSettings ) ;
521- }
522508 }
523509}
0 commit comments